changeset 0:abed8a293168

* seed from vect source
author Chris Cannam
date Fri, 27 Mar 2009 12:41:49 +0000
parents
children f78d846bf880
files i18n/sonic-visualiser_en_GB.qm i18n/sonic-visualiser_en_GB.ts i18n/sonic-visualiser_ru.qm i18n/sonic-visualiser_ru.ts i18n/tips_en.xml icons/README icons/annotation.png icons/colour3d.png icons/cross.png icons/draw-curve.png icons/draw.png icons/editcopy.png icons/editcut.png icons/editdelete.png icons/editpaste.png icons/exit.png icons/fader_background.png icons/fader_knob.png icons/fader_knob_red.png icons/fader_leds.png icons/faders.png icons/ffwd-end.png icons/ffwd.png icons/fileclose.png icons/filenew-22.png icons/filenew.png icons/fileopen-22.png icons/fileopen.png icons/fileopenaudio.png icons/fileopensession.png icons/filesave-22.png icons/filesave.png icons/filesaveas-22.png icons/filesaveas.png icons/help.png icons/hh.gif icons/hh.png icons/info.png icons/instants.png icons/measure.png icons/measure1cursor.xbm icons/measure1mask.xbm icons/measure2cursor.xbm icons/measure2mask.xbm icons/melodogram.png icons/mono.png icons/move.png icons/navigate.png icons/new.png icons/notes.png icons/pane.png icons/playloop.png icons/playpause-orig.png icons/playpause.png icons/playselection.png icons/playselectionloop.png icons/redo.png icons/rewind-start.png icons/rewind.png icons/select.png icons/sharpen.png icons/solo.png icons/speaker.png icons/spectrogram-22x22.png icons/spectrogram.png icons/spectrum.png icons/stereo.png icons/sv-128x128.png icons/sv-16x16.png icons/sv-22x22.png icons/sv-24x24.png icons/sv-32x32.png icons/sv-48x48.png icons/sv-64x64.png icons/sv-icon-light.svg icons/sv-icon.svg icons/sv-macicon.icns icons/svicon16.png icons/svicon32.png icons/text.png icons/timeruler.png icons/undo.png icons/values.png icons/waveform.png icons/zoom-fit.png icons/zoom-in.png icons/zoom-out.png icons/zoom.png main/MainWindow.cpp main/MainWindow.h main/PreferencesDialog.cpp main/PreferencesDialog.h main/main.cpp samples/README samples/bass.wav samples/beep.wav samples/bounce.wav samples/clap.wav samples/click.wav samples/cowbell.wav samples/hihat.wav samples/kick.wav samples/organ.wav samples/piano.wav samples/snare.wav samples/stick.wav samples/strike.wav samples/tap.wav vect.pro vect.qrc version.h
diffstat 111 files changed, 9653 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
Binary file i18n/sonic-visualiser_en_GB.qm has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/sonic-visualiser_en_GB.ts	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,29 @@
+<!DOCTYPE TS><TS>
+<context>
+    <name>QColorDialog</name>
+    <message>
+        <source>Color</source>
+        <translation>Colour</translation>
+    </message>
+    <message>
+        <source>&amp;Basic colors</source>
+        <translation>&amp;Basic colours</translation>
+    </message>
+    <message>
+        <source>&amp;Custom colors</source>
+        <translation>&amp;Custom colours</translation>
+    </message>
+    <message>
+        <source>&amp;Define Custom Colors &gt;&gt;</source>
+        <translation>&amp;Define Custom Colours &gt;&gt;</translation>
+    </message>
+    <message>
+        <source>&amp;Add to Custom Colors</source>
+        <translation>&amp;Add to Custom Colours</translation>
+    </message>
+    <message>
+        <source>Select color</source>
+        <translation>Select colour</translation>
+    </message>
+</context>
+</TS>
Binary file i18n/sonic-visualiser_ru.qm has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/sonic-visualiser_ru.ts	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,5372 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS><TS version="1.1" language="ru">
+<context>
+    <name>AddLayerCommand</name>
+    <message>
+        <location filename="../document/Document.cpp" line="650"/>
+        <source>Add %1 Layer</source>
+        <translation>Добавить слой %1</translation>
+    </message>
+</context>
+<context>
+    <name>AudioDial</name>
+    <message>
+        <location filename="../../widgets/AudioDial.cpp" line="492"/>
+        <source>Enter new value</source>
+        <translation>Введите новое значение</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/AudioDial.cpp" line="402"/>
+        <source>%1: %2%3</source>
+        <translation>%1: %2%3</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/AudioDial.cpp" line="404"/>
+        <source>%2%3</source>
+        <translation>%2%3</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/AudioDial.cpp" line="459"/>
+        <source>New value for %1, from %2 to %3 %4:</source>
+        <translation>Новое значение для «%1», от %2 до %3 %4:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/AudioDial.cpp" line="462"/>
+        <source>New value for %1, from %2 to %3:</source>
+        <translation>Новое значение для «%1», от %2 до %3:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/AudioDial.cpp" line="467"/>
+        <source>Enter a new value from %1 to %2 %3:</source>
+        <translation>Введите новое значение от %1 до %2 %3:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/AudioDial.cpp" line="494"/>
+        <source>Enter a new value from %1 to %2:</source>
+        <translation>Введите новое значение от %1 до %2:</translation>
+    </message>
+</context>
+<context>
+    <name>BZipFileDevice</name>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="49"/>
+        <source>File is already open</source>
+        <translation>Этот файл уже открыт</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="54"/>
+        <source>Append mode not supported</source>
+        <translation>Режим добавления в конец не поддерживается</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="60"/>
+        <source>File access mode not specified</source>
+        <translation>Способ доступа к файлам не указан</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="66"/>
+        <source>Read and write modes both specified</source>
+        <translation>Режимы чтения и записи определены</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="75"/>
+        <source>Failed to open file for writing</source>
+        <translation>Не удалось открыть файл для записи</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="86"/>
+        <source>Failed to open bzip2 stream for writing</source>
+        <translation>Не удалось открыть поток bzip2 для записи</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="102"/>
+        <source>Failed to open file for reading</source>
+        <translation>Не удалось открыть файл для чтения</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="113"/>
+        <source>Failed to open bzip2 stream for reading</source>
+        <translation>Не удалось открыть поток bzip2 для чтения</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="127"/>
+        <source>Internal error (open for neither read nor write)</source>
+        <translation>Внутренняя ошибка (не открывается ни на чтение, ни на запись)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="136"/>
+        <source>File not open</source>
+        <translation>Файл не открыт</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="148"/>
+        <source>bzip2 stream write close error</source>
+        <translation>Ошибка закрытия записи в поток bzip2</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="160"/>
+        <source>bzip2 stream read close error</source>
+        <translation>Ошибка закрытия чтения потока bzip2</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="169"/>
+        <source>Internal error (close for neither read nor write)</source>
+        <translation>Внутренняя ошибка (не закрывается ни чтение, ни запись)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/BZipFileDevice.cpp" line="186"/>
+        <source>bzip2 stream read error</source>
+        <translation>Ошибка чтения потока bzip2</translation>
+    </message>
+</context>
+<context>
+    <name>CSVFileWriter</name>
+    <message>
+        <location filename="../../data/fileio/CSVFileWriter.cpp" line="56"/>
+        <source>Failed to open file %1 for writing</source>
+        <translation>Не удалось открыть файл %1 для записи</translation>
+    </message>
+</context>
+<context>
+    <name>CSVFormatDialog</name>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="283"/>
+        <source>Select Data Format</source>
+        <translation>Выберите формат данных</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="289"/>
+        <source>
+Please select the correct data format for this file.
+</source>
+        <translation>
+Выберите правильный формат данных для этого файла.
+</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="292"/>
+        <source>Each row specifies:</source>
+        <translation>Каждая строка определяет:</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="295"/>
+        <source>A point in time</source>
+        <translation>Точку во времени</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="296"/>
+        <source>A value at a time</source>
+        <translation>Значение во точке времени</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="297"/>
+        <source>A set of values</source>
+        <translation>Серию значений</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="303"/>
+        <source>The first column contains:</source>
+        <translation>Первый столбец содержит:</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="306"/>
+        <source>Time, in seconds</source>
+        <translation>Время, в секундах</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="307"/>
+        <source>Time, in audio sample frames</source>
+        <translation>Время, в выборках звуковых сэмплов</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="308"/>
+        <source>Data (rows are consecutive in time)</source>
+        <translation>Данные (строки последовательны во времени)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="315"/>
+        <source>Audio sample rate (Hz):</source>
+        <translation>Частота сэмплирования звука (Гц):</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="337"/>
+        <source>Frame increment between rows:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="355"/>
+        <source>
+Example data from file:</source>
+        <translation>
+Пример данных из файла:</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="364"/>
+        <source>OK</source>
+        <translation>ОК</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="368"/>
+        <source>Cancel</source>
+        <translation>Отменить</translation>
+    </message>
+</context>
+<context>
+    <name>Colour3DPlotLayer</name>
+    <message>
+        <location filename="../../layer/Colour3DPlotLayer.cpp" line="294"/>
+        <source>Time:<byte value="x9"/>%1 - %2
+Bin:<byte value="x9"/>%3
+Value:<byte value="x9"/>%4</source>
+        <translation>Время:<byte value="x9"/>%1 - %2
+Bin:<byte value="x9"/>%3
+Значение:<byte value="x9"/>%4</translation>
+    </message>
+    <message>
+        <location filename="../../layer/Colour3DPlotLayer.cpp" line="178"/>
+        <source>Linear</source>
+        <translation>Линейный</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>dB</source>
+        <translation type="obsolete">Дб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/Colour3DPlotLayer.cpp" line="183"/>
+        <source>&lt;unknown&gt;</source>
+        <translation>&lt;неизвестно&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../layer/Colour3DPlotLayer.cpp" line="100"/>
+        <source>Colour</source>
+        <translation>Цвет</translation>
+    </message>
+    <message>
+        <location filename="../../layer/Colour3DPlotLayer.cpp" line="120"/>
+        <source>Scale</source>
+        <translation>Масштаб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/Colour3DPlotLayer.cpp" line="102"/>
+        <source>Normalize Columns</source>
+        <translation>Нормализовать столбцы</translation>
+    </message>
+    <message>
+        <location filename="../../layer/Colour3DPlotLayer.cpp" line="103"/>
+        <source>Normalize Visible Area</source>
+        <translation>Нормализовать видимую область</translation>
+    </message>
+    <message>
+        <location filename="../../layer/Colour3DPlotLayer.cpp" line="179"/>
+        <source>Log</source>
+        <translation>Логарифмический</translation>
+    </message>
+    <message>
+        <location filename="../../layer/Colour3DPlotLayer.cpp" line="180"/>
+        <source>+/-1</source>
+        <translation>+/-1</translation>
+    </message>
+</context>
+<context>
+    <name>ColourMapper</name>
+    <message>
+        <location filename="../../layer/ColourMapper.cpp" line="64"/>
+        <source>&lt;unknown&gt;</source>
+        <translation>&lt;неизвестно&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../layer/ColourMapper.cpp" line="52"/>
+        <source>Default</source>
+        <translation>По умолчанию</translation>
+    </message>
+    <message>
+        <location filename="../../layer/ColourMapper.cpp" line="53"/>
+        <source>White on Black</source>
+        <translation>Белое на чёрном</translation>
+    </message>
+    <message>
+        <location filename="../../layer/ColourMapper.cpp" line="54"/>
+        <source>Black on White</source>
+        <translation>Чёрное на белом</translation>
+    </message>
+    <message>
+        <location filename="../../layer/ColourMapper.cpp" line="55"/>
+        <source>Red on Blue</source>
+        <translation>Красное на синем</translation>
+    </message>
+    <message>
+        <location filename="../../layer/ColourMapper.cpp" line="56"/>
+        <source>Yellow on Black</source>
+        <translation>Жёлтое на чёрном</translation>
+    </message>
+    <message>
+        <location filename="../../layer/ColourMapper.cpp" line="57"/>
+        <source>Blue on Black</source>
+        <translation>Синее на чёрном</translation>
+    </message>
+    <message>
+        <location filename="../../layer/ColourMapper.cpp" line="58"/>
+        <source>Sunset</source>
+        <translation>Закат</translation>
+    </message>
+    <message>
+        <location filename="../../layer/ColourMapper.cpp" line="59"/>
+        <source>Fruit Salad</source>
+        <translation>Фруктовый салат</translation>
+    </message>
+    <message>
+        <location filename="../../layer/ColourMapper.cpp" line="60"/>
+        <source>Banded</source>
+        <translation>В полоску</translation>
+    </message>
+    <message>
+        <location filename="../../layer/ColourMapper.cpp" line="61"/>
+        <source>Highlight</source>
+        <translation>Подсветка</translation>
+    </message>
+</context>
+<context>
+    <name>CommandHistory</name>
+    <message>
+        <location filename="../../base/CommandHistory.cpp" line="58"/>
+        <source>&amp;Undo</source>
+        <translation>&amp;Отменить</translation>
+    </message>
+    <message>
+        <location filename="../../base/CommandHistory.cpp" line="51"/>
+        <source>Ctrl+Z</source>
+        <translation>Ctrl+Z</translation>
+    </message>
+    <message>
+        <location filename="../../base/CommandHistory.cpp" line="71"/>
+        <source>Re&amp;do</source>
+        <translation>Ве&amp;рнуть</translation>
+    </message>
+    <message>
+        <location filename="../../base/CommandHistory.cpp" line="64"/>
+        <source>Ctrl+Shift+Z</source>
+        <translation>Ctrl+Shift+Z</translation>
+    </message>
+    <message>
+        <location filename="../../base/CommandHistory.cpp" line="429"/>
+        <source>Nothing to undo</source>
+        <translation>Нет отменяемых действий</translation>
+    </message>
+    <message>
+        <location filename="../../base/CommandHistory.cpp" line="429"/>
+        <source>Nothing to redo</source>
+        <translation>Нет повторяемых действий</translation>
+    </message>
+    <message>
+        <location filename="../../base/CommandHistory.cpp" line="467"/>
+        <source>&amp;Undo %1</source>
+        <translation>&amp;Отменить действие «%1»</translation>
+    </message>
+    <message>
+        <location filename="../../base/CommandHistory.cpp" line="468"/>
+        <source>Re&amp;do %1</source>
+        <translation>Повто&amp;рить действие «%1»</translation>
+    </message>
+    <message>
+        <location filename="../../base/CommandHistory.cpp" line="52"/>
+        <source>Undo the last editing operation</source>
+        <translation>Отменить последнее действие правки</translation>
+    </message>
+    <message>
+        <location filename="../../base/CommandHistory.cpp" line="65"/>
+        <source>Redo the last operation that was undone</source>
+        <translation>Повторить последнее действие правки</translation>
+    </message>
+</context>
+<context>
+    <name>Document::AddLayerCommand</name>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Add %1 Layer</source>
+        <translation type="obsolete">Добавить %1 слой</translation>
+    </message>
+</context>
+<context>
+    <name>Document::RemoveLayerCommand</name>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Delete %1 Layer</source>
+        <translation type="obsolete">Удалить %1 слой</translation>
+    </message>
+</context>
+<context>
+    <name>FFTModel</name>
+    <message>
+        <location filename="../../data/model/FFTModel.cpp" line="102"/>
+        <source>%1 Hz</source>
+        <translation>%1 Гц</translation>
+    </message>
+</context>
+<context>
+    <name>Fader</name>
+    <message>
+        <location filename="../../widgets/Fader.cpp" line="217"/>
+        <source>Level: Off</source>
+        <translation>Уровень: выкл</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/Fader.cpp" line="220"/>
+        <source>Level: %1%2.%3%4 dB</source>
+        <translation>Уровень: %1%2.%3%4 Дб</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/Fader.cpp" line="141"/>
+        <source>Enter new fader level</source>
+        <translation>Ввведите новый уровень фейдера</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/Fader.cpp" line="142"/>
+        <source>New fader level, from %1 to %2 dBFS:</source>
+        <translation>Новый уровень фейдера, от %1 до %2 dBFS:</translation>
+    </message>
+</context>
+<context>
+    <name>FeatureExtractionPluginTransform</name>
+    <message>
+        <location filename="../transform/FeatureExtractionPluginTransform.cpp" line="280"/>
+        <source>FFT cache failed</source>
+        <translation>Не удалось кэшировать FFT</translation>
+    </message>
+    <message>
+        <location filename="../transform/FeatureExtractionPluginTransform.cpp" line="282"/>
+        <source>Failed to create the FFT model for this transform.
+There may be insufficient memory or disc space to continue.</source>
+        <translation>Не удалось создать модель FFT для этого преобразования.
+Вероятно, не хватает памяти или дискового пространства для продолжения.</translation>
+    </message>
+</context>
+<context>
+    <name>FileFinder</name>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="176"/>
+        <source>Select file</source>
+        <translation>Выберите файл</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="177"/>
+        <source>All files (*.*)</source>
+        <translation>Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="183"/>
+        <source>Select a session file</source>
+        <translation>Выберите файл сессии</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="184"/>
+        <source>Sonic Visualiser session files (*.sv)
+All files (*.*)</source>
+        <translation>Файлы сессий Sonic Visualiser (*.sv)
+Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="71"/>
+        <source>Audio files (%1)
+All files (*.*)</source>
+        <translation>Звуковые файлы (%1)
+Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="76"/>
+        <source>All supported files (%1)
+Sonic Visualiser Layer XML files (*.svl)
+Comma-separated data files (*.csv)
+Space-separated .lab files (*.lab)
+MIDI files (*.mid)
+Text files (*.txt)
+All files (*.*)</source>
+        <translation>Все поддерживаемые типы файлов (%1)
+XML-файлы слоёв Sonic Visualiser (*.svl)
+Разделённые запятой файлы данных (*.csv)
+Разделённые пробелом файлы .lab (*.lab)
+MIDI-файлы (*.mid)
+Текстовые файлы (*.txt)
+Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="82"/>
+        <source>All supported files (*.sv %1)
+Sonic Visualiser session files (*.sv)
+Audio files (%1)
+All files (*.*)</source>
+        <translation>Все поддерживаемые типы файлов (*.sv %1)
+Файлы сессий Sonic Visualiser (*.sv)
+Звуковые файлы (%1)
+Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="93"/>
+        <source>All supported files (*.sv %1 %2)
+Sonic Visualiser session files (*.sv)
+Audio files (%1)
+Layer files (%2)
+All files (*.*)</source>
+        <translation>Все поддерживаемые типы файлов (*.sv %1 %2)
+Файлы сессий Sonic Visualiser (*.sv)
+Звуковые файлы (%1)
+Файлы слоёв (%2)
+Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="132"/>
+        <source>File does not exist</source>
+        <translation>Файл не существует</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="133"/>
+        <source>File &quot;%1&quot; does not exist</source>
+        <translation>Файл &quot;%1&quot; не существует</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="138"/>
+        <source>File is not readable</source>
+        <translation>Файл нечитаем</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="139"/>
+        <source>File &quot;%1&quot; can not be read</source>
+        <translation>Файл &quot;%1&quot; не может быть прочитан</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="282"/>
+        <source>Directory selected</source>
+        <translation>Выбран каталог</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="283"/>
+        <source>File &quot;%1&quot; is a directory</source>
+        <translation>Файл &quot;%1&quot; является каталогом</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="150"/>
+        <source>Non-file selected</source>
+        <translation>Выбран не файл</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="151"/>
+        <source>Path &quot;%1&quot; is not a file</source>
+        <translation>Путь &quot;%1&quot; не является файлом</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="156"/>
+        <source>File is empty</source>
+        <translation>Файл пуст</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="157"/>
+        <source>File &quot;%1&quot; is empty</source>
+        <translation>Файл &quot;%1&quot; пуст</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="206"/>
+        <source>Select a file to export to</source>
+        <translation>Выберите файл, в который экспортировать</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="191"/>
+        <source>WAV audio files (*.wav)
+All files (*.*)</source>
+        <translation>Звуковые файлы WAV (*.wav)
+Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="197"/>
+        <source>Sonic Visualiser Layer XML files (*.svl)
+Comma-separated data files (*.csv)
+Text files (*.txt)
+All files (*.*)</source>
+        <translation>XML-файлы слоёв Sonic Visualiser (*.svl)
+Разделённые запятой данные (*.csv)
+Текстовые файлы (*.txt)
+Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="288"/>
+        <source>File exists</source>
+        <translation>Такой файл уже существует</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="289"/>
+        <source>The file &quot;%1&quot; already exists.
+Do you want to overwrite it?</source>
+        <translation>Файл &quot;%1&quot; уже существует.
+Вы хотите перезаписать его?</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="413"/>
+        <source>Audio file &quot;%1&quot; could not be opened.
+Do you want to locate it?</source>
+        <translation>Не удалось открыть звуковой файл &quot;%1&quot;.
+Вы хотите указать его расположение?</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="415"/>
+        <source>File &quot;%1&quot; could not be opened.
+Do you want to locate it?</source>
+        <translation>Не удалось открыть файл &quot;%1&quot;.
+Вы хотите указать его расположение?</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="425"/>
+        <source>Failed to open file</source>
+        <translation>Не удалось открыть файл</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="427"/>
+        <source>Locate file...</source>
+        <translation>Указать файл...</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="428"/>
+        <source>Use URL...</source>
+        <translation>Использовать URL...</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="429"/>
+        <source>Cancel</source>
+        <translation>Отменить</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="448"/>
+        <source>Use URL</source>
+        <translation>Использовать URL</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="449"/>
+        <source>Please enter the URL to use for this file:</source>
+        <translation>Укажите URL, который будет использоваться для этого файла:</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="458"/>
+        <source>Failed to open location</source>
+        <translation>Не удалось открыть местоположение</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="459"/>
+        <source>URL &quot;%1&quot; could not be opened</source>
+        <translation>Не удалось открыть URL &quot;%1&quot;</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/FileFinder.cpp" line="207"/>
+        <source>Portable Network Graphics files (*.png)
+All files (*.*)</source>
+        <translation>Файлы Portable Network Graphics (*.png)
+Все файлы (*.*)</translation>
+    </message>
+</context>
+<context>
+    <name>ItemEditDialog</name>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="57"/>
+        <source>Timing</source>
+        <translation>Тайминг</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="68"/>
+        <source>Time:</source>
+        <translation>Время:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="103"/>
+        <source> frames</source>
+        <translation> выборок</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="112"/>
+        <source> sec</source>
+        <translation>с</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="119"/>
+        <source> usec</source>
+        <translation> мс</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="99"/>
+        <source>Duration:</source>
+        <translation>Длительность:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="131"/>
+        <source>Properties</source>
+        <translation>Свойства</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="144"/>
+        <source>Value:</source>
+        <translation>Значение:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="160"/>
+        <source>Text:</source>
+        <translation>Текст:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="179"/>
+        <source>OK</source>
+        <translation>ОК</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="180"/>
+        <source>Reset</source>
+        <translation>Сбросить</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ItemEditDialog.cpp" line="181"/>
+        <source>Cancel</source>
+        <translation>Отменить</translation>
+    </message>
+</context>
+<context>
+    <name>Layer</name>
+    <message>
+        <location filename="../../layer/LayerFactory.cpp" line="57"/>
+        <source>Waveform</source>
+        <translation>Волновая форма</translation>
+    </message>
+    <message>
+        <location filename="../../layer/LayerFactory.cpp" line="76"/>
+        <source>Spectrogram</source>
+        <translation>Спектрограмма</translation>
+    </message>
+    <message>
+        <location filename="../../layer/LayerFactory.cpp" line="59"/>
+        <source>Ruler</source>
+        <translation>Линейка</translation>
+    </message>
+    <message>
+        <location filename="../../layer/LayerFactory.cpp" line="60"/>
+        <source>Time Instants</source>
+        <translation>Отметки времени</translation>
+    </message>
+    <message>
+        <location filename="../../layer/LayerFactory.cpp" line="61"/>
+        <source>Time Values</source>
+        <translation>Значения времени</translation>
+    </message>
+    <message>
+        <location filename="../../layer/LayerFactory.cpp" line="62"/>
+        <source>Notes</source>
+        <translation>Ноты</translation>
+    </message>
+    <message>
+        <location filename="../../layer/LayerFactory.cpp" line="63"/>
+        <source>Text</source>
+        <translation>Текст</translation>
+    </message>
+    <message>
+        <location filename="../../layer/LayerFactory.cpp" line="64"/>
+        <source>Colour 3D Plot</source>
+        <translation>Цветной 3D-график</translation>
+    </message>
+    <message>
+        <location filename="../../layer/LayerFactory.cpp" line="81"/>
+        <source>Layer</source>
+        <translation>Слой</translation>
+    </message>
+    <message>
+        <location filename="../../layer/LayerFactory.cpp" line="65"/>
+        <source>Spectrum</source>
+        <translation>Спектр</translation>
+    </message>
+    <message>
+        <location filename="../../layer/LayerFactory.cpp" line="66"/>
+        <source>Time Slice</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>LayerTreeModel</name>
+    <message>
+        <location filename="../../widgets/LayerTree.cpp" line="118"/>
+        <source>Layer</source>
+        <translation>Слой</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/LayerTree.cpp" line="119"/>
+        <source>Model</source>
+        <translation>Модель</translation>
+    </message>
+</context>
+<context>
+    <name>ListInputDialog</name>
+    <message>
+        <location filename="../../widgets/ListInputDialog.cpp" line="56"/>
+        <source>OK</source>
+        <translation>ОК</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/ListInputDialog.cpp" line="59"/>
+        <source>Cancel</source>
+        <translation>Отменить</translation>
+    </message>
+</context>
+<context>
+    <name>MIDIFileReader</name>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="300"/>
+        <source>Wrong length for long data in MIDI stream (%1, should be %2)</source>
+        <translation>Неправильная длительность больших данных в потоке MIDI (%1, должно быть %2)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="315"/>
+        <source>Wrong length for int data in MIDI stream (%1, should be %2)</source>
+        <translation>Неправильная длительность int-данных в потоке MIDI (%1, должно быть %2)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="332"/>
+        <source>getMIDIByte called but no MIDI file open</source>
+        <translation>Функция getMIDIByte вызвана, но ни один файл MIDI не открыт</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="365"/>
+        <source>End of MIDI file encountered while reading</source>
+        <translation>При чтении обнаружен конец файла MIDI</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="340"/>
+        <source>Attempt to get more bytes than expected on Track</source>
+        <translation>Попытка получить из дорожки больше байтов, чем ожидалось</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="385"/>
+        <source>Attempt to read past MIDI file end</source>
+        <translation>Попытка прочитать файл MIDI после его окончания</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="361"/>
+        <source>getMIDIBytes called but no MIDI file open</source>
+        <translation>Функция getMIDIBytes вызвана, но ни один файл MIDI не открыт</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="369"/>
+        <source>Attempt to get more bytes than available on Track (%1, only have %2)</source>
+        <translation>Попытка получить из дорожки больше байтов, чем ожидалось  (%1, а есть лишь %2)</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="402"/>
+        <source>getNumberFromMIDIBytes called but no MIDI file open</source>
+        <translation>Функция getNumberFromMIDIBytes вызвана, но ни один файл MIDI не открыт</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="436"/>
+        <source>skipToNextTrack called but no MIDI file open</source>
+        <translation>Функция skipToNextTrack вызвана, но ни один файл MIDI не открыт</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="675"/>
+        <source>Invalid event code %1 found</source>
+        <translation>Обнаружен некорректный код события %1</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="690"/>
+        <source>Running status used for first event in track</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="1006"/>
+        <source>No notes in MIDI file</source>
+        <translation>В MIDI-файле нет нот</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="1008"/>
+        <source>MIDI file &quot;%1&quot; has no notes in any track</source>
+        <translation>Ни в одной дорожке MIDI-файла &quot;%1&quot; нет нот</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="1021"/>
+        <source>Merge all tracks</source>
+        <translation>Объединить все дорожки</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="1022"/>
+        <source>Merge all non-percussion tracks</source>
+        <translation>Объединить все неперкуссионные дорожки</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="1042"/>
+        <source> - uses GM percussion channel</source>
+        <translation> — использует канал перкуссии GM</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="1047"/>
+        <source>Track %1 (%2)%3</source>
+        <translation>Дорожка %1 (%2)%3</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="1050"/>
+        <source>Track %1 (untitled)%3</source>
+        <translation>Дорожка %1 (без имени)%3</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="1057"/>
+        <source>Select track or tracks to import</source>
+        <translation>Выберите одну или несколько дорожек для импорта</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="1058"/>
+        <source>You can only import this file as a single annotation layer,
+but the file contains more than one track,
+or notes on more than one channel.
+
+Please select the track or merged tracks you wish to import:</source>
+        <translation>Вы можете импортировать этот файл как одиночный слой аннотаций,
+но в файле больше одной дорожки,
+либо есть ноте в более чем одном канале.
+
+Выберите, хотите ли вы при импорте выбрать какую-то одну 
+дорожку или же свести все дорожки в одну:</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/MIDIFileReader.cpp" line="1212"/>
+        <source>%1 - vel %2</source>
+        <translation>%1 - vel %2</translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2895"/>
+        <source>Sonic Visualiser</source>
+        <translation>Sonic Visualiser</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="822"/>
+        <source>&amp;Layer</source>
+        <translation>С&amp;лой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="414"/>
+        <source>&amp;File</source>
+        <translation>&amp;Файл</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="416"/>
+        <source>File Toolbar</source>
+        <translation>Панель файлов</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="420"/>
+        <source>&amp;New Session</source>
+        <translation>&amp;Создать сессию</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="421"/>
+        <source>Ctrl+N</source>
+        <translation>Ctrl+N</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Clear the current Sonic Visualiser session and start a new one</source>
+        <translation type="obsolete">Очистить текущую сессию Sonic Visualiser и начать новую</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="428"/>
+        <source>&amp;Open Session...</source>
+        <translation>&amp;Открыть сессию...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="429"/>
+        <source>Ctrl+O</source>
+        <translation>Ctrl+O</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="430"/>
+        <source>Open a previously saved Sonic Visualiser session file</source>
+        <translation>Открыть файл сохранённой ранее сессии Sonic Visualiser</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="437"/>
+        <source>&amp;Open...</source>
+        <translation>О&amp;ткрыть...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="438"/>
+        <source>Open a session file, audio file, or layer</source>
+        <translation>Открыть файл сессии, звуковой файл или слой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="444"/>
+        <source>&amp;Save Session</source>
+        <translation>Сохр&amp;анить сессию</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="445"/>
+        <source>Ctrl+S</source>
+        <translation>Ctrl+S</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="446"/>
+        <source>Save the current session into a Sonic Visualiser session file</source>
+        <translation>Сохранить в файл текущую сессию Sonic Visualiser</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="454"/>
+        <source>Save Session &amp;As...</source>
+        <translation>Сохранить сессию &amp;как...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="455"/>
+        <source>Save the current session into a new Sonic Visualiser session file</source>
+        <translation>Сохранить текущую сессию Sonic Visualiser в файл с другим именем</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="463"/>
+        <source>&amp;Import Audio File...</source>
+        <translation>&amp;Импортировать звуковой файл...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="464"/>
+        <source>Ctrl+I</source>
+        <translation>Ctrl+I</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="465"/>
+        <source>Import an existing audio file</source>
+        <translation>Импортировать существующий звуковой файл</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="469"/>
+        <source>Import Secondary Audio File...</source>
+        <translation>Импортировать второй звуковой файл...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="470"/>
+        <source>Ctrl+Shift+I</source>
+        <translation>Ctrl+Shift+I</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="471"/>
+        <source>Import an extra audio file as a separate layer</source>
+        <translation>Импортировать ещё один звуковой файл в отдельный слой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="476"/>
+        <source>&amp;Export Audio File...</source>
+        <translation>Э&amp;кспортировать звуковой файл...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="477"/>
+        <source>Export selection as an audio file</source>
+        <translation>Экспортировать выделенное в звуковой файл</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="484"/>
+        <source>Import Annotation &amp;Layer...</source>
+        <translation>И&amp;мпортировать слой аннотаций...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="485"/>
+        <source>Ctrl+L</source>
+        <translation>Ctrl+L</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="486"/>
+        <source>Import layer data from an existing file</source>
+        <translation>Импортировать данные слоя из существующего файла</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="491"/>
+        <source>Export Annotation Layer...</source>
+        <translation>Экспортировать слой аннотаций...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="492"/>
+        <source>Export layer data to a file</source>
+        <translation>Экспортировать данные слоя в файл</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="539"/>
+        <source>&amp;Quit</source>
+        <translation>Вы&amp;йти</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="540"/>
+        <source>Ctrl+Q</source>
+        <translation>Ctrl+Q</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="551"/>
+        <source>&amp;Edit</source>
+        <translation>&amp;Правка</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="558"/>
+        <source>Cu&amp;t</source>
+        <translation>&amp;Вырезать</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="559"/>
+        <source>Ctrl+X</source>
+        <translation>Ctrl+X</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="567"/>
+        <source>&amp;Copy</source>
+        <translation>С&amp;копировать</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="568"/>
+        <source>Ctrl+C</source>
+        <translation>Ctrl+C</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="576"/>
+        <source>&amp;Paste</source>
+        <translation>Вст&amp;авить</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="577"/>
+        <source>Ctrl+V</source>
+        <translation>Ctrl+V</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="584"/>
+        <source>&amp;Delete Selected Items</source>
+        <translation>&amp;Удалить выбранное</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="585"/>
+        <source>Del</source>
+        <translation>Del</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="595"/>
+        <source>Select &amp;All</source>
+        <translation>В&amp;ыделить всё</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="596"/>
+        <source>Ctrl+A</source>
+        <translation>Ctrl+A</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="603"/>
+        <source>Select &amp;Visible Range</source>
+        <translation>Вы&amp;делить всё видимое</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="604"/>
+        <source>Ctrl+Shift+A</source>
+        <translation>Ctrl+Shift+A</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="610"/>
+        <source>Select to &amp;Start</source>
+        <translation>Выделить до &amp;начала</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="611"/>
+        <source>Shift+Left</source>
+        <translation>Shift+Left</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="617"/>
+        <source>Select to &amp;End</source>
+        <translation>Выделить до &amp;конца</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="618"/>
+        <source>Shift+Right</source>
+        <translation>Shift+Right</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="624"/>
+        <source>C&amp;lear Selection</source>
+        <translation>Сн&amp;ять выделение</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="625"/>
+        <source>Esc</source>
+        <translation>Esc</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="634"/>
+        <source>&amp;Insert Instant at Playback Position</source>
+        <translation>Вставить &amp;отметку в точку воспроизведения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="635"/>
+        <source>Enter</source>
+        <translation>Enter</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="660"/>
+        <source>&amp;View</source>
+        <translation>&amp;Вид</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="726"/>
+        <source>0</source>
+        <translation>0</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="735"/>
+        <source>9</source>
+        <translation>9</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="744"/>
+        <source>8</source>
+        <translation>8</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="662"/>
+        <source>Scroll &amp;Left</source>
+        <translation>Прокрутить в&amp;лево</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="663"/>
+        <source>Left</source>
+        <translation>Влево</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="664"/>
+        <source>Scroll the current pane to the left</source>
+        <translation>Прокрутить активное окно влево</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="669"/>
+        <source>Scroll &amp;Right</source>
+        <translation>Прокрутить в&amp;право</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="670"/>
+        <source>Right</source>
+        <translation>Вправо</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="671"/>
+        <source>Scroll the current pane to the right</source>
+        <translation>Прокрутить активное окно вправо</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="677"/>
+        <source>Ctrl+Left</source>
+        <translation>Ctrl+Влево</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="678"/>
+        <source>Scroll the current pane a big step to the left</source>
+        <translation>Сделать большой шаг прокрутки влево</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="684"/>
+        <source>Ctrl+Right</source>
+        <translation>Ctrl+Вправо</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="685"/>
+        <source>Scroll the current pane a big step to the right</source>
+        <translation>Сделать большой шаг прокрутки вправо</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="693"/>
+        <source>Zoom &amp;In</source>
+        <translation>При&amp;близить</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="694"/>
+        <source>Up</source>
+        <translation>Вверх</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="695"/>
+        <source>Increase the zoom level</source>
+        <translation>Увеличить масштаб отображения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="701"/>
+        <source>Zoom &amp;Out</source>
+        <translation>&amp;Отдалить</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="702"/>
+        <source>Down</source>
+        <translation>Вниз</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="703"/>
+        <source>Decrease the zoom level</source>
+        <translation>Уменьшить масштаб отображения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="708"/>
+        <source>Restore &amp;Default Zoom</source>
+        <translation>&amp;Восстановить обычный масштаб</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="715"/>
+        <source>Zoom to &amp;Fit</source>
+        <translation>&amp;Уместить в окне</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="716"/>
+        <source>Zoom to show the whole file</source>
+        <translation>Увидеть весь файл</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="814"/>
+        <source>&amp;Pane</source>
+        <translation>&amp;Окно</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="828"/>
+        <source>Add &amp;New Pane</source>
+        <translation>Добавить &amp;новое окно</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="829"/>
+        <source>Alt+N</source>
+        <translation>Alt+н</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="830"/>
+        <source>Add a new pane containing only a time ruler</source>
+        <translation>Добавить новое окно, содержащее только линейку времени</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="856"/>
+        <source>Add New %1 Layer</source>
+        <translation>Добавить новый слой «%1»</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="857"/>
+        <source>Add a new empty layer of type %1</source>
+        <translation>Добавить новый пустой слой типа «%1»</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="863"/>
+        <source>Alt+T</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="910"/>
+        <source>Add &amp;Waveform</source>
+        <translation>Добавить &amp;волновую форму</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="912"/>
+        <source>Alt+W</source>
+        <translation>Alt+в</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="913"/>
+        <source>Add a new pane showing a waveform view</source>
+        <translation>Добавить новое окно с видом волновой формы</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="915"/>
+        <source>Add a new layer showing a waveform view</source>
+        <translation>Добавить новый слой с видом волновой формы</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="922"/>
+        <source>Add &amp;Spectrogram</source>
+        <translation>Добавить &amp;спектограмму</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="924"/>
+        <source>Alt+S</source>
+        <translation>Alt+с</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Add a new pane showing a dB spectrogram</source>
+        <translation type="obsolete">Добавить новую панель со спектрограммой в Дб</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="933"/>
+        <source>Add &amp;Melodic Range Spectrogram</source>
+        <translation>Добавить спектограмму &amp;мелодического диапазона</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="935"/>
+        <source>Alt+M</source>
+        <translation>Alt+м</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="944"/>
+        <source>Add &amp;Peak Frequency Spectrogram</source>
+        <translation>Добавить спектограмму &amp;пиковой частоты</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="946"/>
+        <source>Alt+P</source>
+        <translation>Alt+п</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="947"/>
+        <source>Add a new pane showing a spectrogram set up for tracking frequencies</source>
+        <translation>Добавить новое окно, отображающее спектрограмму для отслеживания частот</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="949"/>
+        <source>Add a new layer showing a spectrogram set up for tracking frequencies</source>
+        <translation>Добавить новый слой, отображающий спектрограмму для отслеживания частот</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1039"/>
+        <source>&amp;All Channels Mixed</source>
+        <translation>Все &amp;каналы сведены</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1041"/>
+        <source>&amp;All Channels</source>
+        <translation>&amp;Все каналы</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1044"/>
+        <source>Channel &amp;%1</source>
+        <translation>Канал &amp;%1</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1090"/>
+        <source>&amp;Delete Pane</source>
+        <translation>У&amp;далить окно</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1091"/>
+        <source>Alt+D</source>
+        <translation>Alt+д</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Delete the currently selected pane</source>
+        <translation type="obsolete">Удалить активную панель</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1099"/>
+        <source>Add &amp;Time Ruler</source>
+        <translation>Добавить линейку &amp;времени</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1100"/>
+        <source>Add a new layer showing a time ruler</source>
+        <translation>Добавить новый слой с линейкой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1108"/>
+        <source>Add &amp;Existing Layer</source>
+        <translation>Добавить &amp;существующий слой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1121"/>
+        <source>&amp;Rename Layer...</source>
+        <translation>&amp;Переименовать слой...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1122"/>
+        <source>Alt+R</source>
+        <translation>Alt+п</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1123"/>
+        <source>Rename the currently active layer</source>
+        <translation>Переименовать активный слой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1129"/>
+        <source>&amp;Delete Layer</source>
+        <translation>&amp;Удалить слой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1130"/>
+        <source>Alt+Shift+D</source>
+        <translation>Alt+Shift+D</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1131"/>
+        <source>Delete the currently active layer</source>
+        <translation>Удалить активный слой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1346"/>
+        <source>&amp;Help</source>
+        <translation>&amp;Справка</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1350"/>
+        <source>&amp;Help Reference</source>
+        <translation>&amp;Справка по программе</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1351"/>
+        <source>Open the Sonic Visualiser reference manual</source>
+        <translation>Открыть справку по Sonic Visualiser</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1355"/>
+        <source>Sonic Visualiser on the &amp;Web</source>
+        <translation>Sonic Visualiser в &amp;Интернете</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1356"/>
+        <source>Open the Sonic Visualiser website</source>
+        <translation>Открыть веб-сайт Sonic Visualiser</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1360"/>
+        <source>&amp;About Sonic Visualiser</source>
+        <translation>&amp;О Sonic Visualiser</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1361"/>
+        <source>Show information about Sonic Visualiser</source>
+        <translation>Показать информацию о Sonic Visualiser</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1477"/>
+        <source>Transport Toolbar</source>
+        <translation>Панель транспорта</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1480"/>
+        <source>Rewind to Start</source>
+        <translation>Перемотать в начало</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1481"/>
+        <source>Home</source>
+        <translation>Домой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1482"/>
+        <source>Rewind to the start</source>
+        <translation>Перемотать в начало</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1487"/>
+        <source>Rewind</source>
+        <translation>Назад</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1488"/>
+        <source>PageUp</source>
+        <translation>PageUp</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1489"/>
+        <source>Rewind to the previous time instant in the current layer</source>
+        <translation>Перемотать до предыдущей отметки времени в текущем слое</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1494"/>
+        <source>Play / Pause</source>
+        <translation>Воспроизвести / Приостановить</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1496"/>
+        <source>Space</source>
+        <translation>Пробел</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1497"/>
+        <source>Start or stop playback from the current position</source>
+        <translation>Запустить или остановить воспроизведение с текущей позиции</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1504"/>
+        <source>Fast Forward</source>
+        <translation>Вперёд</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1505"/>
+        <source>PageDown</source>
+        <translation>PageDown</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1506"/>
+        <source>Fast forward to the next time instant in the current layer</source>
+        <translation>Перемотать до следующей отметки времени в текущем слое</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1511"/>
+        <source>Fast Forward to End</source>
+        <translation>Перемотать до конца</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1512"/>
+        <source>End</source>
+        <translation>Конец</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1513"/>
+        <source>Fast-forward to the end</source>
+        <translation>Перемотать до конца</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1517"/>
+        <source>Play Mode Toolbar</source>
+        <translation>Панель режима воспроизведения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1520"/>
+        <source>Constrain Playback to Selection</source>
+        <translation>Ограничить воспроизведение выделением</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1523"/>
+        <source>s</source>
+        <translation>с</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1524"/>
+        <source>Constrain playback to the selected area</source>
+        <translation>Ограничить воспроизведение выделенной областью</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1531"/>
+        <source>Loop Playback</source>
+        <translation>Воспроизведение в цикле</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1534"/>
+        <source>l</source>
+        <translation>l</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1535"/>
+        <source>Loop playback</source>
+        <translation>Воспроизведение в цикле</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1541"/>
+        <source>Edit Toolbar</source>
+        <translation>Панель правки</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1544"/>
+        <source>Tools Toolbar</source>
+        <translation>Панель инструментов</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1552"/>
+        <source>Navigate</source>
+        <translation>Перемещение</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1551"/>
+        <source>1</source>
+        <translation>1</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1558"/>
+        <source>Select</source>
+        <translation>Выделение</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1560"/>
+        <source>2</source>
+        <translation>2</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1567"/>
+        <source>Edit</source>
+        <translation>Правка</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1569"/>
+        <source>3</source>
+        <translation>3</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1577"/>
+        <source>Draw</source>
+        <translation>Рисование</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1579"/>
+        <source>4</source>
+        <translation>4</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1665"/>
+        <source>No audio file loaded.</source>
+        <translation>Ни один звуковой файл не загружен.</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1676"/>
+        <source>%1Hz (resampling to %2Hz)</source>
+        <translation>%1 Гц (ресэмплирование до %2 Гц)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1695"/>
+        <source>%1 (modified)</source>
+        <translation>%1 (изменён)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1709"/>
+        <source> (modified)</source>
+        <translation> (изменён)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1849"/>
+        <source>Cut</source>
+        <translation>Вырезать</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1970"/>
+        <source>Add Point</source>
+        <translation>Добавить точку</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1991"/>
+        <source>Add Points</source>
+        <translation>Добавить точки</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Select an audio file</source>
+        <translation type="obsolete">Выбрать звуковой файл</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Audio files (%1)
+All files (*.*)</source>
+        <translation type="obsolete">Звуковые файлы (%1)
+Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2772"/>
+        <source>Failed to open file</source>
+        <translation>Не удалось открыть файл</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2018"/>
+        <source>Audio file &quot;%1&quot; could not be opened</source>
+        <translation>Не удалось открыть звуковой файл &quot;%1&quot;</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>WAV audio files (*.wav)
+All files (*.*)</source>
+        <translation type="obsolete">Звуковые файлы WAV (*.wav)
+Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2046"/>
+        <source>Export the selected region only</source>
+        <translation>Экспортировать только выделенную область</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2063"/>
+        <source>Export the whole audio file</source>
+        <translation>Экспортировать весь звуковой файл</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2353"/>
+        <source>Select region to export</source>
+        <translation>Выделите область для экспорта</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2051"/>
+        <source>Which region from the original audio file do you want to export?</source>
+        <translation>Какую область исходного звукового файла вы хотите экспортировать?</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2062"/>
+        <source>Export the selected regions into a single audio file</source>
+        <translation>Экспортировать выделенные области в один звуковой файл</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2063"/>
+        <source>Export the selected regions into separate files</source>
+        <translation>Экспортировать выделенные области в разные звуковые файлы</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2067"/>
+        <source>Multiple regions of the original audio file are selected.
+What do you want to export?</source>
+        <translation>Выбрано несколько областей исходного звукового файла.
+Какую из них вы хотите экспортировать?</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2094"/>
+        <source>Fragment file %1 already exists, aborting</source>
+        <translation>Файл фрагмента %1 уже существует, прерывание</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3061"/>
+        <source>Failed to write file</source>
+        <translation>Не удалось записать файл</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Select file</source>
+        <translation type="obsolete">Выберите файл</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>All supported files (%1)
+Sonic Visualiser Layer XML files (*.svl)
+Comma-separated data files (*.csv)
+Space-separated .lab files (*.lab)
+MIDI files (*.mid)
+Text files (*.txt)
+All files (*.*)</source>
+        <translation type="obsolete">Все поддерживаемые типы файлов (%1)
+XML-файлы слоёв Sonic Visualiser (*.svl)
+Разделённые запятой файлы данных (*.csv)
+Разделённые пробелом файлы .lab (*.lab)
+MIDI-файлы (*.mid)
+Текстовые файлы (*.txt)
+Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2153"/>
+        <source>File %1 could not be opened.</source>
+        <translation>Не удалось открыть файл %1.</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Sonic Visualiser Layer XML files (*.svl)
+Comma-separated data files (*.csv)
+Text files (*.txt)
+All files (*.*)</source>
+        <translation type="obsolete">XML-файлы слоёв Sonic Visualiser (*.svl)
+Разделённые запятой данные (*.csv)
+Текстовые файлы (*.txt)
+Все файлы (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2267"/>
+        <source>Failed to open file %1 for writing</source>
+        <translation>Не удалось открыть файл %1 для записи</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2430"/>
+        <source>Replace the existing main waveform</source>
+        <translation>Заменить существующую основную волновую форму</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2430"/>
+        <source>Load this file into a new waveform pane</source>
+        <translation>Загрузить этот файл в новое окно волновой формы</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2434"/>
+        <source>Select target for import</source>
+        <translation>Выбрать цель для импорта</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3033"/>
+        <source>Sonic Visualiser: %1</source>
+        <translation>Sonic Visualiser: %1</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2470"/>
+        <source>Sonic Visualiser: %1 [%2]</source>
+        <translation>Sonic Visualiser: %1 [%2]</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2483"/>
+        <source>Import &quot;%1&quot;</source>
+        <translation>Импортировать &quot;%1&quot;</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2526"/>
+        <source>Couldn&apos;t open audio device</source>
+        <translation>Не удалось открыть звуковое устройство</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2527"/>
+        <source>Could not open an audio device for playback.
+Audio playback will not be available during this session.
+</source>
+        <translation>Не удалось открыть звуковое устройство для воспроизведения.
+В этот раз воспроизведение будет недоступно.
+</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>File &quot;%1&quot; does not exist or is not a readable file</source>
+        <translation type="obsolete">Файл &quot;%1&quot; не существует, либо в него нельзя записывать</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2759"/>
+        <source>Session file &quot;%1&quot; could not be opened</source>
+        <translation>Не удалось открыть файл сессии &quot;%1&quot;</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>All supported files (*.sv %1 %2)
+Sonic Visualiser session files (*.sv)
+Audio files (%1)
+Layer files (%2)
+All files (*.*)</source>
+        <translation type="obsolete">All supported files (*.sv %1 %2)
+Sonic Visualiser session files (*.sv)
+Audio files (%1)
+Layer files (%2)
+All files (*.*)</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>All supported files (*.sv %1)
+Sonic Visualiser session files (*.sv)
+Audio files (%1)
+All files (*.*)</source>
+        <translation type="obsolete">All supported files (*.sv %1)
+Sonic Visualiser session files (*.sv)
+Audio files (%1)
+All files (*.*)</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Select a file to open</source>
+        <translation type="obsolete">Выберите файл для открытия</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2773"/>
+        <source>File &quot;%1&quot; could not be opened</source>
+        <translation>Не удалось открыть файл &quot;%1&quot;</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2866"/>
+        <source>SV XML file read error:
+%1</source>
+        <translation>Ошибка чтения XML-файла SV:
+%1</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2979"/>
+        <source>Session modified</source>
+        <translation>Сессия изменена</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2980"/>
+        <source>The current session has been modified.
+Do you want to save it?</source>
+        <translation>Текущая сессия была изменена.
+Вы хотите сохранить её?</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3029"/>
+        <source>Failed to save file</source>
+        <translation>Не удалось сохранить файл</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3030"/>
+        <source>Session file &quot;%1&quot; could not be saved.</source>
+        <translation>Не удалось сохранить файл сессии &quot;%1&quot;.</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Directory selected</source>
+        <translation type="obsolete">Выбран каталог</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>File &quot;%1&quot; is a directory</source>
+        <translation type="obsolete">Файл &quot;%1&quot; является каталогом</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>File exists</source>
+        <translation type="obsolete">Такой файл уже существует</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>The file &quot;%1&quot; already exists.
+Do you want to overwrite it?</source>
+        <translation type="obsolete">Файл &quot;%1&quot; уже существует.
+Вы хотите перезаписать его?</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3063"/>
+        <source>Failed to write to file &quot;%1&quot;: %2</source>
+        <translation>Не удалось записать файл &quot;%1&quot;: %2</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3662"/>
+        <source>Delete Pane</source>
+        <translation>Удалить окно</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3706"/>
+        <source>Rename Layer</source>
+        <translation>Переименовать слой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3707"/>
+        <source>New name for this layer:</source>
+        <translation>Новое имя этого слоя:</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3896"/>
+        <source>Sample rate mismatch</source>
+        <translation>Несоответствие частоты дискретизации</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4014"/>
+        <source>Failed to regenerate layer</source>
+        <translation>Не удалось повторно создать слой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4609"/>
+        <source>http://www.sonicvisualiser.org/</source>
+        <translation>http://www.sonicvisualiser.org/</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>http://www.sonicvisualiser.org/doc/reference/en/</source>
+        <translation type="obsolete">http://www.sonicvisualiser.org/doc/reference/en/</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4669"/>
+        <source>Release %1 : Revision %2</source>
+        <translation>Версия %1 : Редакция %2</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4671"/>
+        <source>Release %1</source>
+        <translation>Версия %1</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4675"/>
+        <source>Unreleased : Revision %1</source>
+        <translation>Не выпущено : редакция %1</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4681"/>
+        <source>&lt;h3&gt;About Sonic Visualiser&lt;/h3&gt;</source>
+        <translation>&lt;h3&gt;О программе Sonic Visualiser&lt;/h3&gt;</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>&lt;p&gt;%1 : %2 build&lt;/p&gt;</source>
+        <translation type="obsolete">&lt;p&gt;%1 : сборка %2&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4685"/>
+        <source>Debug</source>
+        <translation>Отладка</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4685"/>
+        <source>Release</source>
+        <translation>Версия</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4696"/>
+        <source>&lt;p&gt;Statically linked</source>
+        <translation>&lt;p&gt;Статически слинкована</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4698"/>
+        <source>&lt;br&gt;With Qt (v%1) &amp;copy; Trolltech AS</source>
+        <translation>&lt;br&gt;С Qt (v%1) &amp;copy; Trolltech AS</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4702"/>
+        <source>&lt;br&gt;With JACK audio output (v%1) &amp;copy; Paul Davis and Jack O&apos;Quin</source>
+        <translation>&lt;br&gt;С выводом в JACK (v%1) &amp;copy; Paul Davis и Jack O&apos;Quin</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4708"/>
+        <source>&lt;br&gt;With PortAudio audio output &amp;copy; Ross Bencina and Phil Burk</source>
+        <translation>&lt;br&gt;С выводом в PortAudio &amp;copy; Ross Bencina и Phil Burk</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4712"/>
+        <source>&lt;br&gt;With Ogg file decoder (oggz v%1, fishsound v%2) &amp;copy; CSIRO Australia</source>
+        <translation>&lt;br&gt;С декодером Ogg (oggz v%1, fishsound v%2) &amp;copy; CSIRO Australia</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4719"/>
+        <source>&lt;br&gt;With MAD mp3 decoder (v%1) &amp;copy; Underbit Technologies Inc</source>
+        <translation>&lt;br&gt;С декодером MAD mp3 (v%1) &amp;copy; Underbit Technologies Inc</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4726"/>
+        <source>&lt;br&gt;With libsamplerate (v%1) &amp;copy; Erik de Castro Lopo</source>
+        <translation>&lt;br&gt;С libsamplerate (v%1) &amp;copy; Erik de Castro Lopo</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4733"/>
+        <source>&lt;br&gt;With libsndfile (v%1) &amp;copy; Erik de Castro Lopo</source>
+        <translation>&lt;br&gt;С libsndfile (v%1) &amp;copy; Erik de Castro Lopo</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4740"/>
+        <source>&lt;br&gt;With FFTW3 (v%1) &amp;copy; Matteo Frigo and MIT</source>
+        <translation>&lt;br&gt;С FFTW3 (v%1) &amp;copy; Matteo Frigo и MIT</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>&lt;br&gt;With Vamp plugin support (API v%1, SDK v%2) &amp;copy; Chris Cannam</source>
+        <translation type="obsolete">&lt;br&gt;С поддержкой расширений Vamp (API v%1, SDK v%2) &amp;copy; Chris Cannam</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4748"/>
+        <source>&lt;br&gt;With LADSPA plugin support (API v%1) &amp;copy; Richard Furse, Paul Davis, Stefan Westerfeld</source>
+        <translation>&lt;br&gt;С поддержкой расширений LADSPA (API v%1) &amp;copy; Richard Furse, Paul Davis, Stefan Westerfeld</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4749"/>
+        <source>&lt;br&gt;With DSSI plugin support (API v%1) &amp;copy; Chris Cannam, Steve Harris, Sean Bolton</source>
+        <translation>&lt;br&gt;С поддержкой расширений DSSI (API v%1) &amp;copy; Chris Cannam, Steve Harris, Sean Bolton</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4772"/>
+        <source>About Sonic Visualiser</source>
+        <translation>О программе Sonic Visualiser</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4003"/>
+        <source>Failed to generate layer</source>
+        <translation>Не удалось создать слой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="523"/>
+        <source>Adjust the application preferences</source>
+        <translation>Изменить параметры работы приложения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2435"/>
+        <source>You already have an audio waveform loaded.
+What would you like to do with the new audio file?</source>
+        <translation>У вас уже есть загруженная волновая форма звука.
+Что вы хотите сделать с новым звуковым файлом?</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="211"/>
+        <source>Sharpen percussive transients</source>
+        <translation>Обострить перкуссионные моменты</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="223"/>
+        <source>Run time stretcher in mono only</source>
+        <translation>Запускать растягиватель времени только в монорежиме</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="515"/>
+        <source>&amp;Recent Files</source>
+        <translation>Н&amp;едавние файлы</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="522"/>
+        <source>&amp;Preferences...</source>
+        <translation>&amp;Параметры...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="649"/>
+        <source>;</source>
+        <translation>;</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="763"/>
+        <source>Show &amp;Zoom Wheels</source>
+        <translation>Показывать &amp;колёса масштабирования</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="764"/>
+        <source>Z</source>
+        <translation>Z</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="765"/>
+        <source>Show thumbwheels for zooming horizontally and vertically</source>
+        <translation>Показывать колёса для масштабирования по горизонтали и вертикали</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1180"/>
+        <source>%1 by Category</source>
+        <translation>%1 по категории</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1267"/>
+        <source>Unclassified</source>
+        <translation>Неклассифицированные</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1233"/>
+        <source>%1 by Maker</source>
+        <translation>%1 по имени создателя</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1270"/>
+        <source>Unknown</source>
+        <translation>Неизвестен</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1226"/>
+        <source>%1 by Plugin Name</source>
+        <translation>%1 названию расширения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1302"/>
+        <source>%1...</source>
+        <translation>%1...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="955"/>
+        <source>Add Spectr&amp;um</source>
+        <translation>Добавить &amp;график спектральной функции</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="957"/>
+        <source>Alt+U</source>
+        <translation>Alt+г</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="958"/>
+        <source>Add a new pane showing a frequency spectrum</source>
+        <translation>Добавить новое окно с частотой спектра</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="960"/>
+        <source>Add a new layer showing a frequency spectrum</source>
+        <translation>Добавить новый слой с частотой спектра</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="201"/>
+        <source>Playback Speedup</source>
+        <translation>Ускорение воспроизведения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1146"/>
+        <source>&amp;Transform</source>
+        <translation>Пр&amp;еобразования</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1049"/>
+        <source>%1: %2</source>
+        <translation>%1: %2</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1164"/>
+        <source>&amp;Recent Transforms</source>
+        <translation>&amp;Недавние преобразования</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1271"/>
+        <source> [\(&lt;].*$</source>
+        <translation> [\(&lt;].*$</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3908"/>
+        <source>Audio processing overload</source>
+        <translation>Перегрузка в обработке звука</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3909"/>
+        <source>Audio effects plugin auditioning has been disabled
+due to a processing overload.</source>
+        <translation>Прослушивание обработки расширениями эффектов 
+отключено из-за перегрузки в обработке звука.</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4005"/>
+        <source>Failed to generate a derived layer.
+
+The layer transform &quot;%1&quot; failed.
+
+This probably means that a plugin failed to initialise, perhaps because it
+rejected the processing block size that was requested.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4016"/>
+        <source>Failed to regenerate derived layer &quot;%1&quot;.
+
+The layer transform &quot;%2&quot; failed to run.
+
+This probably means the layer used a plugin that is not currently available.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="771"/>
+        <source>Show Property Bo&amp;xes</source>
+        <translation>Показывать панели с&amp;войств</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="772"/>
+        <source>X</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="773"/>
+        <source>Show the layer property boxes at the side of the main window</source>
+        <translation>Показывать панели свойств слоёв сбоку от основного окна</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4310"/>
+        <source>Add %1 Pane</source>
+        <translation>Добавить окно %1</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4752"/>
+        <source>&lt;br&gt;With liblo Lite OSC library (v%1) &amp;copy; Steve Harris</source>
+        <translation>&lt;br&gt;С библиотекой liblo Lite OSC library (v%1) &amp;copy; Steve Harris</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4757"/>
+        <source>&lt;p&gt;The OSC URL for this instance is: &quot;%1&quot;</source>
+        <translation>&lt;p&gt;OSC URL для этой копии процесса: &quot;%1&quot;</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="422"/>
+        <source>Abandon the current Sonic Visualiser session and start a new one</source>
+        <translation>Отказаться от текущей сессии Sonic Visualiser и начать новую</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="507"/>
+        <source>Open Lo&amp;cation...</source>
+        <translation>Открыть &amp;местоположение...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="508"/>
+        <source>Ctrl+Shift+O</source>
+        <translation>Ctrl+Shift+O</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="509"/>
+        <source>Open or import a file from a remote URL</source>
+        <translation>Открыть или импортировать файл с удалённого узла</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="541"/>
+        <source>Exit Sonic Visualiser</source>
+        <translation>Выйти из Sonic Visualiser</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="560"/>
+        <source>Cut the selection from the current layer to the clipboard</source>
+        <translation>Вырезать выделение из активного слоя в буфер обмена</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="569"/>
+        <source>Copy the selection from the current layer to the clipboard</source>
+        <translation>Скопировать выделение из активного слоя в буфер обмена</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="578"/>
+        <source>Paste from the clipboard to the current layer</source>
+        <translation>Вставить содержимое буфера обмена в активный слой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="586"/>
+        <source>Delete the selection from the current layer</source>
+        <translation>Удалить выделение из активного слоя</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="597"/>
+        <source>Select the whole duration of the current session</source>
+        <translation>Выбрать всю длительность активной сессии</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="605"/>
+        <source>Select the time range corresponding to the current window width</source>
+        <translation>Сделать временной диапазон равным активной ширине окна</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="612"/>
+        <source>Select from the start of the session to the current playback position</source>
+        <translation>Выделить от начала сессии до текущей точки воспроизведения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="619"/>
+        <source>Select from the current playback position to the end of the session</source>
+        <translation>Выделить от текущей точки воспроизведения до конца сессии</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="626"/>
+        <source>Clear the selection</source>
+        <translation>Очистить выделение</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="636"/>
+        <source>Insert a new time instant at the current playback position, in a new layer if necessary</source>
+        <translation>Вставить новую отметку времени в точку воспроизведения, при необходимости — в новый слой</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="641"/>
+        <source>Insert Instants at Selection &amp;Boundaries</source>
+        <translation>Вставить отметки времени по &amp;краям выделения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="642"/>
+        <source>Shift+Enter</source>
+        <translation>Shift+Enter</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="643"/>
+        <source>Insert new time instants at the start and end of the current selection, in a new layer if necessary</source>
+        <translation>Вставить новые отметки времени в начале и конце активного выделения, при необходимости — в новом слое</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="676"/>
+        <source>&amp;Jump Left</source>
+        <translation>Перескочить в&amp;лево</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="683"/>
+        <source>J&amp;ump Right</source>
+        <translation>П&amp;ерескочить вправо</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="709"/>
+        <source>Restore the zoom level to the default</source>
+        <translation>Восстановить обычный масштаб отображения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="725"/>
+        <source>Show &amp;No Overlays</source>
+        <translation>Не по&amp;казывать перекрытия совсем</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="727"/>
+        <source>Hide centre indicator, frame times, layer names and scale</source>
+        <translation>Спрятать индикацию центра, времён выделения, имена слоёв и масштаб</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="734"/>
+        <source>Show &amp;Minimal Overlays</source>
+        <translation>Показывать &amp;минимум перекрытий</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="736"/>
+        <source>Show centre indicator only</source>
+        <translation>Показывать только индикатор центра</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="743"/>
+        <source>Show &amp;Standard Overlays</source>
+        <translation>Показывать о&amp;бычные перекрытия</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="745"/>
+        <source>Show centre indicator, frame times and scale</source>
+        <translation>Показывать индикатор центра, времена выделений, имена слоёв и масштаб</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="752"/>
+        <source>Show &amp;All Overlays</source>
+        <translation>Показывать в&amp;се перекрытия</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="753"/>
+        <source>7</source>
+        <translation>7</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="754"/>
+        <source>Show all texts and scale</source>
+        <translation>Показывать весь текст и масштаб</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="779"/>
+        <source>Show Status &amp;Bar</source>
+        <translation>Показывать статусную &amp;строку</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="780"/>
+        <source>Show context help information in the status bar at the bottom of the window</source>
+        <translation>Показывать контекстную справку в статусной строке, находящейся внизу окна программы</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="925"/>
+        <source>Add a new pane showing a spectrogram</source>
+        <translation>Добавить новое окно с отображением спектрограммы</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="927"/>
+        <source>Add a new layer showing a spectrogram</source>
+        <translation>Добавить новый слой с отображением спектрограммы</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="936"/>
+        <source>Add a new pane showing a spectrogram set up for an overview of note pitches</source>
+        <translation>Добавить новое окно, отображающее спектрограмму для обзора высоты тона нот</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="938"/>
+        <source>Add a new layer showing a spectrogram set up for an overview of note pitches</source>
+        <translation>Добавить новый слой, отображающий спектрограмму для обзора высоты тона нот</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1092"/>
+        <source>Delete the currently active pane</source>
+        <translation>Удалить активное окно</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1112"/>
+        <source>Add S&amp;lice of Layer</source>
+        <translation>Добавить &amp;фрагмент слоя</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1561"/>
+        <source>Select ranges</source>
+        <translation>Выбрать диапазон</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1570"/>
+        <source>Edit items in layer</source>
+        <translation>Изменить объекты слоя</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="1580"/>
+        <source>Draw new items in layer</source>
+        <translation>Нарисовать новые объекты в слое</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2716"/>
+        <source>Open Location</source>
+        <translation>Открыть местоположение</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2717"/>
+        <source>Please enter the URL of the location to open:</source>
+        <translation>Введите URL открываемого местоположения:</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2727"/>
+        <source>Failed to open location</source>
+        <translation>Не удалось открыть местоположение</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2728"/>
+        <source>URL &quot;%1&quot; could not be opened</source>
+        <translation>Не удалось открыть URL &quot;%1&quot;</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2785"/>
+        <source>Unsupported scheme in URL</source>
+        <translation>Неподдерживаемая схема URL</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2787"/>
+        <source>The URL scheme &quot;%1&quot; is not supported</source>
+        <translation>Схема URL &quot;%1&quot; не поддерживается</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2793"/>
+        <source>File download failed</source>
+        <translation>Не удалось скачать файл</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2795"/>
+        <source>Failed to download URL &quot;%1&quot;: %2</source>
+        <translation>Не удалось скачать URL &quot;%1&quot;: %2</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3798"/>
+        <source>Playing: %1 of %2 (%3 remaining)</source>
+        <translation>Воспроизводится: %1 из %2 (осталось %3)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3876"/>
+        <source>Visible: %1 to %2 (duration %3)</source>
+        <translation>Видимая область: от %1 до %2 (длительность %3)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4572"/>
+        <source>Adjust the master playback level</source>
+        <translation>Изменить общую громкость воспроизведения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4574"/>
+        <source>Adjust the master playback speed</source>
+        <translation>Изменить общую скорость воспроизведения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4576"/>
+        <source>Toggle transient sharpening for playback time scaling</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4578"/>
+        <source>Toggle mono mode for playback time scaling</source>
+        <translation>Переключить моно-режим для масштабирования времени воспроизведения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4682"/>
+        <source>&lt;p&gt;Sonic Visualiser is a program for viewing and exploring audio data for&lt;br&gt;semantic music analysis and annotation.&lt;/p&gt;</source>
+        <translation>&lt;p&gt;Sonic Visualiser — программа для просмотра и исследования звуковых&lt;br&gt;данных с целью семантического анализа и аннотации музыки.&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4684"/>
+        <source>&lt;p&gt;%1 : %2 configuration&lt;/p&gt;</source>
+        <translation>&lt;p&gt;%1 : Конфигурация %2&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4704"/>
+        <source>&lt;br&gt;With JACK audio output &amp;copy; Paul Davis and Jack O&apos;Quin</source>
+        <translation>&lt;br&gt;С выводом в JACK &amp;copy; Paul Davis и Jack O&apos;Quin</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4714"/>
+        <source>&lt;br&gt;With Ogg file decoder &amp;copy; CSIRO Australia</source>
+        <translation>&lt;br&gt;С декодером Ogg &amp;copy; CSIRO Australia</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4721"/>
+        <source>&lt;br&gt;With MAD mp3 decoder &amp;copy; Underbit Technologies Inc</source>
+        <translation>&lt;br&gt;С декодером MAD mp3 &amp;copy; Underbit Technologies Inc</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4728"/>
+        <source>&lt;br&gt;With libsamplerate &amp;copy; Erik de Castro Lopo</source>
+        <translation>&lt;br&gt;С libsamplerate &amp;copy; Erik de Castro Lopo</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4735"/>
+        <source>&lt;br&gt;With libsndfile &amp;copy; Erik de Castro Lopo</source>
+        <translation>&lt;br&gt;С libsndfile &amp;copy; Erik de Castro Lopo</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4742"/>
+        <source>&lt;br&gt;With FFTW3 &amp;copy; Matteo Frigo and MIT</source>
+        <translation>&lt;br&gt;С FFTW3 &amp;copy; Matteo Frigo и MIT</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4746"/>
+        <source>&lt;br&gt;With Vamp plugin support (API v%1, host SDK v%2) &amp;copy; Chris Cannam</source>
+        <translation>&lt;br&gt;С поддержкой расширений Vamp (API v%1, host SDK v%2) &amp;copy; Chris Cannam</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4754"/>
+        <source>&lt;br&gt;With liblo Lite OSC library &amp;copy; Steve Harris</source>
+        <translation>&lt;br&gt;С liblo Lite OSC library &amp;copy; Steve Harris</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="499"/>
+        <source>Export Image File...</source>
+        <translation>Экспортировать в файл изображения...</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="500"/>
+        <source>Export a single pane to an image file</source>
+        <translation>Экспортировать всё окно в файл изображения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2336"/>
+        <source>Export the whole pane (%1x%2 pixels)</source>
+        <translation>Экспортировать всё окно (%1x%2 пикселов)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2338"/>
+        <source>Export the visible area only (%1x%2 pixels)</source>
+        <translation>Экспортировать только видимую часть (%1x%2 пикселов)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2341"/>
+        <source>Export the selection extent (%1x%2 pixels)</source>
+        <translation>Экспортировать выделение (%1x%2 пикселов)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2343"/>
+        <source>Export the selection extent</source>
+        <translation>Экспортировать выделение</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2354"/>
+        <source>Which region of the current pane do you want to export as an image?</source>
+        <translation>Какую область текущего окна вы хотите экспортировать как изображение?</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2362"/>
+        <source>Note: the whole pane is too wide to be exported as a single image.</source>
+        <translation>Примечание: всё окно слишком широко, чтобы сохранить его как изображение.</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2387"/>
+        <source>Failed to save image file</source>
+        <translation>Не удалось сохранить файл изображения</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="2388"/>
+        <source>Failed to save image file %1</source>
+        <translation>Не удалось сохранить файл изображения %1</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3873"/>
+        <source>Selection: %1 to %2 (duration %3)</source>
+        <translation>Выделение: %1 до %2 (длительность %3)</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3898"/>
+        <source>The sample rate of this audio file (%1 Hz) does not match
+the current playback rate (%2 Hz).
+
+The file will play at the wrong speed and pitch.</source>
+        <translation>Частота сэмплирования этого звукового файла (%1 Гц) не совпадает
+с текущей частотой сэмплирования для воспроизведения (%2 Гц).
+
+Файл будет воспроизведён с неправильной скоростью и высотой тона.</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4615"/>
+        <source>http://www.sonicvisualiser.org/doc/reference/1.0/en/</source>
+        <translation>http://www.sonicvisualiser.org/doc/reference/1.0/ru/</translation>
+    </message>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="4691"/>
+        <source>&lt;br&gt;Using Qt v%1 &amp;copy; Trolltech AS</source>
+        <translation>&lt;br&gt;С Qt v%1 &amp;copy; Trolltech AS</translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow::AddPaneCommand</name>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3460"/>
+        <source>Add Pane</source>
+        <translation>Добавить окно</translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow::RemovePaneCommand</name>
+    <message>
+        <location filename="../main/MainWindow.cpp" line="3507"/>
+        <source>Remove Pane</source>
+        <translation>Удалить окно</translation>
+    </message>
+</context>
+<context>
+    <name>NoteLayer</name>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="668"/>
+        <source>New Point</source>
+        <translation>Новая точка</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="82"/>
+        <source>Colour</source>
+        <translation>Цвет</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="83"/>
+        <source>Vertical Scale</source>
+        <translation>Верт. масштаб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="156"/>
+        <source>Black</source>
+        <translation>Чёрный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="157"/>
+        <source>Red</source>
+        <translation>Красный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="158"/>
+        <source>Blue</source>
+        <translation>Синий</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="159"/>
+        <source>Green</source>
+        <translation>Зелёный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="160"/>
+        <source>Purple</source>
+        <translation>Пурпурный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="161"/>
+        <source>Orange</source>
+        <translation>Оранжевый</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="166"/>
+        <source>Auto-Align</source>
+        <translation>Автовыравнивание</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Linear Scale</source>
+        <translation type="obsolete">Линейная шкала</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Log Scale</source>
+        <translation type="obsolete">Логарифм. шкала</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>MIDI Note Range</source>
+        <translation type="obsolete">Диапазон MIDI-нот</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="172"/>
+        <source>&lt;unknown&gt;</source>
+        <translation>&lt;неизвестно&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="329"/>
+        <source>In progress</source>
+        <translation>В процессе</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="354"/>
+        <source>No local points</source>
+        <translation>Нет локальных точек</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="385"/>
+        <source>Time:<byte value="x9"/>%1
+Pitch:<byte value="x9"/>%2
+Duration:<byte value="x9"/>%3
+No label</source>
+        <translation>Время:<byte value="x9"/>%1
+Высота тона:<byte value="x9"/>%2
+Длительность:<byte value="x9"/>%3
+Без метки</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="390"/>
+        <source>Time:<byte value="x9"/>%1
+Pitch:<byte value="x9"/>%2
+Duration:<byte value="x9"/>%3
+Label:<byte value="x9"/>%4</source>
+        <translation>Время:<byte value="x9"/>%1
+Высота тона:<byte value="x9"/>%2
+Длительность:<byte value="x9"/>%3
+Метка:<byte value="x9"/>%4</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="673"/>
+        <source>Draw Point</source>
+        <translation>Нарисовать точку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="754"/>
+        <source>Drag Point</source>
+        <translation>Перетащить точку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="823"/>
+        <source>Edit Point</source>
+        <translation>Изменить точку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="777"/>
+        <source>Relocate Point</source>
+        <translation>Переместить точку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="780"/>
+        <source>Change Point Value</source>
+        <translation>Изменить значение точки</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="838"/>
+        <source>Drag Selection</source>
+        <translation>Перетащить выделение</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="863"/>
+        <source>Resize Selection</source>
+        <translation>Изменить размер выделения</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="902"/>
+        <source>Delete Selected Points</source>
+        <translation>Удалить выбранные точки</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="943"/>
+        <source>Paste</source>
+        <translation>Вставить</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="84"/>
+        <source>Scale Units</source>
+        <translation type="unfinished">Единицы шкалы</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="99"/>
+        <source>Scale</source>
+        <translation>Масштаб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="167"/>
+        <source>Linear</source>
+        <translation>Линейный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="168"/>
+        <source>Log</source>
+        <translation>Логарифмический</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="169"/>
+        <source>MIDI Notes</source>
+        <translation>Ноты MIDI</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="369"/>
+        <source>%1 (%2 Hz)</source>
+        <translation>%1 (%2 Гц)</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="374"/>
+        <source>%1 Hz (%2)</source>
+        <translation>%1 Гц (%2)</translation>
+    </message>
+    <message>
+        <location filename="../../layer/NoteLayer.cpp" line="379"/>
+        <source>%1 %2</source>
+        <translation>%1 %2</translation>
+    </message>
+</context>
+<context>
+    <name>Overview</name>
+    <message>
+        <location filename="../../view/Overview.cpp" line="32"/>
+        <source>Overview</source>
+        <translation>Обзор</translation>
+    </message>
+    <message>
+        <location filename="../../view/Overview.cpp" line="231"/>
+        <source>Click and drag to navigate; double-click to jump</source>
+        <translation>Щёлкните и потащите для перемещения по окну; щёлкните дважды для скачка</translation>
+    </message>
+</context>
+<context>
+    <name>Pane</name>
+    <message>
+        <location filename="../../view/Pane.cpp" line="449"/>
+        <source>Some lengthy prefix:</source>
+        <translation>Некий длинный префикс:</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="584"/>
+        <source>(R)</source>
+        <translation>(R)</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="586"/>
+        <source>(X)</source>
+        <translation>(X)</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="591"/>
+        <source>%1 / %2Hz%3</source>
+        <translation>%1 / %2 Гц%3</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1654"/>
+        <source>Drag Selection</source>
+        <translation>Перетащить выделение</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1661"/>
+        <source>Resize Selection</source>
+        <translation>Изменить выделение</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="102"/>
+        <source>Horizontal Zoom</source>
+        <translation>Горизонтальное масштабирование</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="126"/>
+        <source>Vertical Zoom</source>
+        <translation>Вертикальное масштабирование</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1590"/>
+        <source>Enter new range</source>
+        <translation>Введите новый диапазон</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1592"/>
+        <source>New vertical display range, from %1 to %2 %4:</source>
+        <translation>Новый диапазон отображения по вертикали, от %1 до %2 %4:</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1802"/>
+        <source>Click and drag to navigate</source>
+        <translation>Щёлкните и потащите для перемещения по окну</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1812"/>
+        <source>Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigate</source>
+        <translation>Щёлкните и потащите для выделения области; + Shift — для отключения прилипания к объектам; + Ctrl — для выделения нескольких объектов, + средняя клавиша мыши — для перемещения по окну</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1814"/>
+        <source>Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigate</source>
+        <translation>Щёлкните и потащите для выделения диапазона; + Ctrl — для выделения нескольких объектов, + средняя клавиша мыши — для перемещения по окну</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1822"/>
+        <source>Click and drag to move the selection boundary</source>
+        <translation>Щёлкните и потащите для перемещения границ выделения</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1827"/>
+        <source>Click and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigate</source>
+        <translation>Щёлкните и потащите для выделения области; + Shift — для отключения прилипания к объектам; + средняя клавиша мыши — для перемещения по окну</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1829"/>
+        <source>Click and drag to select a range; middle-click and drag to navigate</source>
+        <translation>Щёлкните и потащите для выделения области; + средняя клавиша мыши — для перемещения по окну</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1837"/>
+        <source>Click to add a new item in the active layer</source>
+        <translation>Щёлкните для добавления нового объекта на активный слой</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1844"/>
+        <source>Click and drag an item in the active layer to move it</source>
+        <translation>Щёлкните объект и потащите его для перемещения в активном слое</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1849"/>
+        <source>Click and drag to move all items in the selected range</source>
+        <translation>Щёлкните и потащите все объекты в выделенной области</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1865"/>
+        <source>Click and drag to adjust the visible range of the vertical scale</source>
+        <translation>Щёлкните и потащите для смены видимого диапазона масштабирования по вертикали</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1867"/>
+        <source>Click and drag to adjust the vertical zoom level</source>
+        <translation>Щёлкните и потащите для смены уровня масштабирования по вертикали</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1869"/>
+        <source>Click and drag to adjust the horizontal zoom level</source>
+        <translation>Щёлкните и потащите для смены уровня масштабирования по горизонтали</translation>
+    </message>
+    <message>
+        <location filename="../../view/Pane.cpp" line="1871"/>
+        <source>Reset horizontal and vertical zoom levels to their defaults</source>
+        <translation>Сбросить уровни масштабирования по горизонтали и вертикали до исходных значений</translation>
+    </message>
+</context>
+<context>
+    <name>PluginParameterBox</name>
+    <message>
+        <location filename="../../widgets/PluginParameterBox.cpp" line="59"/>
+        <source>This plugin has no adjustable parameters.</source>
+        <translation>У этого расширения нет изменяемых параметров.</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterBox.cpp" line="79"/>
+        <source>Program</source>
+        <translation>Программа</translation>
+    </message>
+</context>
+<context>
+    <name>PluginParameterDialog</name>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Plugin</source>
+        <translation type="obsolete">Расширение</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="93"/>
+        <source>Name:</source>
+        <translation>Имя:</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Type:</source>
+        <translation type="obsolete">Тип:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="124"/>
+        <source>Maker:</source>
+        <translation>Автор:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="130"/>
+        <source>Copyright:  </source>
+        <translation>Авторские права:  </translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="111"/>
+        <source>Version:</source>
+        <translation>Версия:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="171"/>
+        <source>Plugin Parameters</source>
+        <translation>Параметры расширения</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="283"/>
+        <source>Channel mismatch</source>
+        <translation>Несовпадение каналов</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="284"/>
+        <source>This plugin requires at least %1 input channels, but only %2 %3 available.  The plugin probably will not work correctly.</source>
+        <translation>Этому расширению нужно хотя бы %1 вхдных каналовs, но лишь %2 %3 доступны.  Вероятно, расширение не сработает как должно.</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="284"/>
+        <source>are</source>
+        <translation>являются</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="284"/>
+        <source>is</source>
+        <translation>является</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="197"/>
+        <source>Channels</source>
+        <translation>Каналы</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="302"/>
+        <source>This plugin accepts no more than %1 input channels,
+but %2 are available.  Only the first %3 will be used.
+</source>
+        <translation>Это расширение принимает не более %1 каналов на входе,
+но доступно целых %2. Только первые %3 будут использованы.
+</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="308"/>
+        <source>This plugin only has a single channel input,
+but the source has %1 channels.</source>
+        <translation>Это расширение может обрабатывать только один канал,
+но у источника %1 каналов.</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="311"/>
+        <source>Use mean of source channels</source>
+        <translation>Использовать среднее значение каналов источника</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="313"/>
+        <source>Use channel %1 only</source>
+        <translation>Использовать только канал %1</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="227"/>
+        <source>OK</source>
+        <translation>ОК</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="228"/>
+        <source>Cancel</source>
+        <translation>Отменить</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="142"/>
+        <source>Output:</source>
+        <translation>Выход:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="203"/>
+        <source>Processing</source>
+        <translation>Обработка</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="363"/>
+        <source>Window size:</source>
+        <translation>Размер оконной функции:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="365"/>
+        <source>Audio frames per block:</source>
+        <translation>Выборок звука на блок:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="390"/>
+        <source>Window increment:</source>
+        <translation>Шаг:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="414"/>
+        <source>Window shape:</source>
+        <translation>Форма:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="499"/>
+        <source>Advanced &gt;&gt;</source>
+        <translation>Больше &gt;&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="496"/>
+        <source>Advanced &lt;&lt;</source>
+        <translation>Меньше &lt;&lt;</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PluginParameterDialog.cpp" line="161"/>
+        <source>Input Source</source>
+        <translation>Источник</translation>
+    </message>
+</context>
+<context>
+    <name>Preferences</name>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="80"/>
+        <source>Frequency of concert A</source>
+        <translation>Частота концерта A</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="83"/>
+        <source>Property box layout</source>
+        <translation>Внешний вид панели свойств</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="86"/>
+        <source>Spectral analysis window shape</source>
+        <translation>Форма оконной функции при спектральном анализе</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="157"/>
+        <source>Show boxes for all panes</source>
+        <translation>Показывать панели для всех окон</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="158"/>
+        <source>Show box for current pane only</source>
+        <translation>Показывать панель только для активного окна</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="162"/>
+        <source>Rectangular</source>
+        <translation>Прямоугольная</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="163"/>
+        <source>Triangular</source>
+        <translation>Треугольная</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="164"/>
+        <source>Hamming</source>
+        <translation>Хамминга</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="165"/>
+        <source>Hanning</source>
+        <translation>Ханнинга</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="166"/>
+        <source>Blackman</source>
+        <translation>Блэкмена</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="167"/>
+        <source>Gaussian</source>
+        <translation>Гауссова</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="168"/>
+        <source>Parzen</source>
+        <translation>Парзена</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="169"/>
+        <source>Nuttall</source>
+        <translation>Нутталла</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="170"/>
+        <source>Blackman-Harris</source>
+        <translation>Блэкмена-Харриса</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="194"/>
+        <source>Preferences</source>
+        <translation>Параметры</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="89"/>
+        <source>Playback resampler type</source>
+        <translation>Тип ресэмплирования при воспроизведении</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="175"/>
+        <source>Fastest</source>
+        <translation>Самый быстрый</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="176"/>
+        <source>Standard</source>
+        <translation>Обычный</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="177"/>
+        <source>Highest quality</source>
+        <translation>Наивысшего качества</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="77"/>
+        <source>Spectrogram y-axis smoothing:</source>
+        <translation>Сглаживание спектрограммы по оси Y:</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="182"/>
+        <source>None - blocky but accurate</source>
+        <translation>Никакого — ступеньками, но аккуратно</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="183"/>
+        <source>Interpolate - fast but fuzzy</source>
+        <translation>Интерполировать — быстро, но грязно</translation>
+    </message>
+    <message>
+        <location filename="../../base/Preferences.cpp" line="184"/>
+        <source>Zero pad FFT - slow but clear</source>
+        <translation>Zero pad FFT — медленно, но чисто</translation>
+    </message>
+</context>
+<context>
+    <name>PreferencesDialog</name>
+    <message>
+        <location filename="../main/PreferencesDialog.cpp" line="34"/>
+        <source>Application Preferences</source>
+        <translation>Настройки программы</translation>
+    </message>
+    <message>
+        <location filename="../main/PreferencesDialog.cpp" line="42"/>
+        <source>Sonic Visualiser Application Preferences</source>
+        <translation>Настройки программы Sonic Visualiser</translation>
+    </message>
+    <message>
+        <location filename="../main/PreferencesDialog.cpp" line="50"/>
+        <source>Apply</source>
+        <translation>Применить</translation>
+    </message>
+    <message>
+        <location filename="../main/PreferencesDialog.cpp" line="140"/>
+        <source>%1:</source>
+        <translation>%1:</translation>
+    </message>
+    <message>
+        <location filename="../main/PreferencesDialog.cpp" line="150"/>
+        <source>OK</source>
+        <translation>ОК</translation>
+    </message>
+    <message>
+        <location filename="../main/PreferencesDialog.cpp" line="151"/>
+        <source>Cancel</source>
+        <translation>Отменить</translation>
+    </message>
+</context>
+<context>
+    <name>PropertyBox</name>
+    <message>
+        <location filename="../../widgets/PropertyBox.cpp" line="145"/>
+        <source>Show</source>
+        <translation>Показать</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PropertyBox.cpp" line="162"/>
+        <source>Play</source>
+        <translation>Воспроизвести</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PropertyBox.cpp" line="229"/>
+        <source>Playback Pan / Balance</source>
+        <translation>Панорама/баланс при воспроизведении</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PropertyBox.cpp" line="200"/>
+        <source>Playback Gain</source>
+        <translation>Усиление воспроизведения</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PropertyBox.cpp" line="202"/>
+        <source>dB</source>
+        <translation>Дб</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PropertyBox.cpp" line="671"/>
+        <source> (current value: %1%2)</source>
+        <translation> (текущее значение: %1%2)</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PropertyBox.cpp" line="673"/>
+        <source> (current value: %1)</source>
+        <translation> (текущее значение: %1)</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PropertyBox.cpp" line="678"/>
+        <source>Toggle Visibility of %1</source>
+        <translation>Переключить видимость %1</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PropertyBox.cpp" line="680"/>
+        <source>Toggle Playback of %1</source>
+        <translation>Переключить воспроизведение %1</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PropertyBox.cpp" line="685"/>
+        <source>Toggle %1 property of %2</source>
+        <translation>Переключить %1 свойство %2</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/PropertyBox.cpp" line="688"/>
+        <source>Adjust %1 property of %2%3</source>
+        <translation>Скорректировать %1 свойство %2%3</translation>
+    </message>
+</context>
+<context>
+    <name>PropertyContainer</name>
+    <message>
+        <location filename="../../base/PropertyContainer.cpp" line="157"/>
+        <source>yes</source>
+        <translation>да</translation>
+    </message>
+    <message>
+        <location filename="../../base/PropertyContainer.cpp" line="158"/>
+        <source>on</source>
+        <translation>вкл</translation>
+    </message>
+    <message>
+        <location filename="../../base/PropertyContainer.cpp" line="158"/>
+        <source>true</source>
+        <translation>правда</translation>
+    </message>
+    <message>
+        <location filename="../../base/PropertyContainer.cpp" line="161"/>
+        <source>no</source>
+        <translation>нет</translation>
+    </message>
+    <message>
+        <location filename="../../base/PropertyContainer.cpp" line="162"/>
+        <source>off</source>
+        <translation>выкл</translation>
+    </message>
+    <message>
+        <location filename="../../base/PropertyContainer.cpp" line="162"/>
+        <source>false</source>
+        <translation>ложь</translation>
+    </message>
+</context>
+<context>
+    <name>PropertyContainer::SetPropertyCommand</name>
+    <message>
+        <location filename="../../base/PropertyContainer.cpp" line="258"/>
+        <source>Set %1 Property</source>
+        <translation>Установить свойство %1</translation>
+    </message>
+</context>
+<context>
+    <name>PropertyStack</name>
+    <message>
+        <location filename="../../widgets/PropertyStack.cpp" line="234"/>
+        <source>Click to change the current active layer</source>
+        <translation>Щёлкните для смены активного слоя</translation>
+    </message>
+</context>
+<context>
+    <name>QApplication</name>
+    <message>
+        <location filename="../../data/fft/FFTDataServer.cpp" line="822"/>
+        <source>FFT cache resize failed</source>
+        <translation>Не удалось изменить размер кэша FFT</translation>
+    </message>
+    <message>
+        <location filename="../../data/fft/FFTDataServer.cpp" line="825"/>
+        <source>Failed to create or resize an FFT model slice.
+There may be insufficient memory or disc space to continue.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../main/main.cpp" line="216"/>
+        <source>
+Sonic Visualiser is a program for viewing and exploring audio data
+for semantic music analysis and annotation.
+
+Usage:
+
+  %1 [--no-audio] [--no-osc] [&lt;file&gt; ...]
+
+  --no-audio: Do not attempt to open an audio output device
+  --no-osc: Do not provide an Open Sound Control port for remote control
+  &lt;file&gt;: One or more Sonic Visualiser (.sv) and audio files may be provided.
+</source>
+        <translation>
+Sonic Visualiser — программа для просмотра и исследования звуковых данных
+с целью семантического анализа и аннотации музыки.
+
+Использование:
+
+  %1 [--no-audio] [--no-osc] [&lt;файл&gt; ...]
+
+  --no-audio: не пытаться открыть устройство звукового вывода
+  --no-osc: не предоставлять порт Open Sound Control для удалённого управления
+  &lt;файл&gt;: можно указать один и более файлов Sonic Visualiser (.sv) и звуковых файлов.
+</translation>
+    </message>
+</context>
+<context>
+    <name>QFile</name>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="48"/>
+        <source>File &quot;%1&quot; does not exist</source>
+        <translation>Файл &quot;%1&quot; не существует</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/CSVFileReader.cpp" line="50"/>
+        <source>Failed to open file &quot;%1&quot;</source>
+        <translation>Не удалось открыть файл &quot;%1&quot;</translation>
+    </message>
+</context>
+<context>
+    <name>QFileDialog</name>
+    <message>
+        <location filename="../../data/fileio/SVFileReader.cpp" line="387"/>
+        <source>Locate file &quot;%1&quot;</source>
+        <translation>Найти файл &quot;%1&quot;</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/SVFileReader.cpp" line="389"/>
+        <source>Audio files (%1)
+All files (*.*)</source>
+        <translation>Звуковые файлы (%1)
+Все файлы (*.*)</translation>
+    </message>
+</context>
+<context>
+    <name>QMessageBox</name>
+    <message>
+        <location filename="../main/main.cpp" line="318"/>
+        <source>Failed to open file</source>
+        <translation>Не удалось открыть файл</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/SVFileReader.cpp" line="382"/>
+        <source>Audio file &quot;%1&quot; could not be opened.
+Locate it?</source>
+        <translation>Не удалось открыть звуковой файл &quot;%1&quot;.
+Найти его?</translation>
+    </message>
+    <message>
+        <location filename="../main/main.cpp" line="319"/>
+        <source>File &quot;%1&quot; could not be opened</source>
+        <translation>Не удалось открыть файл &quot;%1&quot;</translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../../data/fileio/OggVorbisFileReader.cpp" line="70"/>
+        <source>Stop</source>
+        <translation>Остановить</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/OggVorbisFileReader.cpp" line="69"/>
+        <source>Decoding %1...</source>
+        <translation>Декодируется %1...</translation>
+    </message>
+</context>
+<context>
+    <name>RangeInputDialog</name>
+    <message>
+        <location filename="../../widgets/RangeInputDialog.cpp" line="47"/>
+        <source> to </source>
+        <translation> до </translation>
+    </message>
+    <message>
+        <location filename="../../widgets/RangeInputDialog.cpp" line="61"/>
+        <source>OK</source>
+        <translation>ОК</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/RangeInputDialog.cpp" line="64"/>
+        <source>Cancel</source>
+        <translation>Отменить</translation>
+    </message>
+</context>
+<context>
+    <name>RemoteFile</name>
+    <message>
+        <location filename="../../data/fileio/RemoteFile.cpp" line="101"/>
+        <source>Downloading %1...</source>
+        <translation>Скачивается %1...</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/RemoteFile.cpp" line="101"/>
+        <source>Cancel</source>
+        <translation>Отменить</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/RemoteFile.cpp" line="226"/>
+        <source>Failed to connect to FTP server</source>
+        <translation>Не удалось соединиться с FTP-сервером</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/RemoteFile.cpp" line="228"/>
+        <source>Login failed</source>
+        <translation>Не удалось авторизоваться</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/RemoteFile.cpp" line="230"/>
+        <source>Failed to change to correct directory</source>
+        <translation>Не удалось поменять на корректный каталог</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/RemoteFile.cpp" line="232"/>
+        <source>FTP download aborted</source>
+        <translation>Скачивание с FTP-сервера прервано</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/RemoteFile.cpp" line="258"/>
+        <source>Download cancelled</source>
+        <translation>Скачивание отменено</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/RemoteFile.cpp" line="287"/>
+        <source>Failed to create local file %1</source>
+        <translation>Не удалось создать локальный файл %1</translation>
+    </message>
+    <message>
+        <location filename="../../data/fileio/RemoteFile.cpp" line="290"/>
+        <source>File contains no data!</source>
+        <translation>Файл не содержит данных!</translation>
+    </message>
+</context>
+<context>
+    <name>RemoveLayerCommand</name>
+    <message>
+        <location filename="../document/Document.cpp" line="698"/>
+        <source>Delete %1 Layer</source>
+        <translation>Удалить слой %1 </translation>
+    </message>
+</context>
+<context>
+    <name>SliceLayer</name>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="156"/>
+        <source>%1 - %2</source>
+        <translation>%1 - %2</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="162"/>
+        <source>Time:<byte value="x9"/>%1 - %2
+Range:<byte value="x9"/>%3 samples
+Bin:<byte value="x9"/>%4
+%5 value:<byte value="x9"/>%6</source>
+        <translation>Время:<byte value="x9"/>%1 - %2
+Диапазон:<byte value="x9"/>%3 сэмплов
+Bin:<byte value="x9"/>%4
+%5 значение:<byte value="x9"/>%6</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="166"/>
+        <source>First</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="653"/>
+        <source>Mean</source>
+        <translation type="unfinished">Усреднённо</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="654"/>
+        <source>Peak</source>
+        <translation>Пик</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="175"/>
+        <source>Time:<byte value="x9"/>%1 - %2
+Range:<byte value="x9"/>%3 samples</source>
+        <translation>Время:<byte value="x9"/>%1 - %2
+Диапазон:<byte value="x9"/>%3 сэмпл(-ов)</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="442"/>
+        <source>0dB</source>
+        <translation>0 Дб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="443"/>
+        <source>-Inf</source>
+        <translation>-Inf</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="474"/>
+        <source>x10</source>
+        <translation>x10</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="500"/>
+        <source>Colour</source>
+        <translation>Цвет</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="526"/>
+        <source>Plot Type</source>
+        <translation>Тип графика</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="524"/>
+        <source>Scale</source>
+        <translation>Масштаб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="503"/>
+        <source>Normalize</source>
+        <translation>Нормализовать</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="504"/>
+        <source>Gain</source>
+        <translation>Усиление</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="505"/>
+        <source>Sampling Mode</source>
+        <translation>Режим сэмплирования</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="506"/>
+        <source>Plot X Scale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="632"/>
+        <source>Black</source>
+        <translation>Чёрный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="633"/>
+        <source>Red</source>
+        <translation>Красный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="634"/>
+        <source>Blue</source>
+        <translation>Синий</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="635"/>
+        <source>Green</source>
+        <translation>Зелёный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="636"/>
+        <source>Purple</source>
+        <translation>Пурпурный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="637"/>
+        <source>Orange</source>
+        <translation>Оранжевый</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="644"/>
+        <source>Linear</source>
+        <translation>Линейный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="645"/>
+        <source>Meter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="681"/>
+        <source>dB</source>
+        <translation>Дб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="652"/>
+        <source>Any</source>
+        <translation>Любые</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="660"/>
+        <source>Lines</source>
+        <translation>Линии</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="661"/>
+        <source>Steps</source>
+        <translation>Шаги</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="662"/>
+        <source>Blocks</source>
+        <translation>Блоки</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="663"/>
+        <source>Colours</source>
+        <translation>Цвета</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="669"/>
+        <source>Linear Bins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="670"/>
+        <source>Log Bins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="671"/>
+        <source>Rev Log Bins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SliceLayer.cpp" line="674"/>
+        <source>&lt;unknown&gt;</source>
+        <translation>&lt;неизвестно&gt;</translation>
+    </message>
+</context>
+<context>
+    <name>SparseModel</name>
+    <message>
+        <location filename="../../data/model/SparseModel.h" line="152"/>
+        <source>Add Point</source>
+        <translation>Добавить точку</translation>
+    </message>
+    <message>
+        <location filename="../../data/model/SparseModel.h" line="177"/>
+        <source>Delete Point</source>
+        <translation>Удалить точку</translation>
+    </message>
+    <message>
+        <location filename="../../data/model/SparseModel.h" line="233"/>
+        <source>Re-Label Point</source>
+        <translation>Переразметить точку</translation>
+    </message>
+</context>
+<context>
+    <name>SpectrogramLayer</name>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="202"/>
+        <source>Colour</source>
+        <translation>Цвет</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="164"/>
+        <source>Colour Scale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="165"/>
+        <source>Window Size</source>
+        <translation>Размер окна</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="167"/>
+        <source>Normalize Columns</source>
+        <translation>Нормализовать столбцы</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="169"/>
+        <source>Bin Display</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="170"/>
+        <source>Threshold</source>
+        <translation>Порог</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="171"/>
+        <source>Gain</source>
+        <translation>Усиление</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="172"/>
+        <source>Colour Rotation</source>
+        <translation>Вращение цвета</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="173"/>
+        <source>Min Frequency</source>
+        <translation>Мин. частота</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="174"/>
+        <source>Max Frequency</source>
+        <translation>Макс. частота</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="175"/>
+        <source>Frequency Scale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="199"/>
+        <source>Window</source>
+        <translation>Окно</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="206"/>
+        <source>Scale</source>
+        <translation>Масштаб</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Default</source>
+        <translation type="obsolete">По умолчанию</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>White on Black</source>
+        <translation type="obsolete">Белое на чёрном</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Black on White</source>
+        <translation type="obsolete">Чёрное на белом</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Red on Blue</source>
+        <translation type="obsolete">Красное на синем</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Yellow on Black</source>
+        <translation type="obsolete">Жёлтое на чёрном</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Blue on Black</source>
+        <translation type="obsolete">Синее на чёрном</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Fruit Salad</source>
+        <translation type="obsolete">Фруктовый салат</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="434"/>
+        <source>Linear</source>
+        <translation>Линейный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="377"/>
+        <source>Meter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="456"/>
+        <source>dB</source>
+        <translation>Дб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="380"/>
+        <source>Phase</source>
+        <translation>Фаза</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="404"/>
+        <source>No min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="405"/>
+        <source>10 Hz</source>
+        <translation>10 Гц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="406"/>
+        <source>20 Hz</source>
+        <translation>20 Гц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="407"/>
+        <source>40 Hz</source>
+        <translation>40 Гц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="408"/>
+        <source>100 Hz</source>
+        <translation>100 Гц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="409"/>
+        <source>250 Hz</source>
+        <translation>250 Гц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="419"/>
+        <source>500 Hz</source>
+        <translation>500 Гц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="420"/>
+        <source>1 KHz</source>
+        <translation>1 КГц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="423"/>
+        <source>4 KHz</source>
+        <translation>4 КГц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="413"/>
+        <source>10 KHz</source>
+        <translation>10 КГц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="421"/>
+        <source>1.5 KHz</source>
+        <translation>1,5 КГц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="422"/>
+        <source>2 KHz</source>
+        <translation>2 КГц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="424"/>
+        <source>6 KHz</source>
+        <translation>6 КГц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="425"/>
+        <source>8 KHz</source>
+        <translation>8 КГц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="426"/>
+        <source>12 KHz</source>
+        <translation>12 КГц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="427"/>
+        <source>16 KHz</source>
+        <translation>16 КГц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="428"/>
+        <source>No max</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="435"/>
+        <source>Log</source>
+        <translation>Логарифм.</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="441"/>
+        <source>All Bins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="442"/>
+        <source>Peak Bins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="443"/>
+        <source>Frequencies</source>
+        <translation>Частоты</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="446"/>
+        <source>&lt;unknown&gt;</source>
+        <translation>&lt;неизвестно&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2563"/>
+        <source>Peak Frequency:<byte value="x9"/>%1 - %2 Hz
+</source>
+        <translation>Пиковая частота:<byte value="x9"/>%1 - %2 Гц
+</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2566"/>
+        <source>Peak Frequency:<byte value="x9"/>%1 Hz
+</source>
+        <translation>Пиковая частота:<byte value="x9"/>%1 Гц
+</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2573"/>
+        <source>Peak Pitch:<byte value="x9"/>%3 - %4
+</source>
+        <translation>Пиковая высота тона:<byte value="x9"/>%3 - %4
+</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2575"/>
+        <source>Peak Pitch:<byte value="x9"/>%2
+</source>
+        <translation>Пиковая высота тона:<byte value="x9"/>%2
+</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2587"/>
+        <source>Time:<byte value="x9"/>%1 - %2
+</source>
+        <translation>Время:<byte value="x9"/>%1 - %2
+</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2591"/>
+        <source>Time:<byte value="x9"/>%1
+</source>
+        <translation>Время:<byte value="x9"/>%1
+</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2596"/>
+        <source>%1Bin Frequency:<byte value="x9"/>%2 - %3 Hz
+%4Bin Pitch:<byte value="x9"/>%5 - %6
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2604"/>
+        <source>%1Bin Frequency:<byte value="x9"/>%2 Hz
+%3Bin Pitch:<byte value="x9"/>%4
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2621"/>
+        <source>-Inf</source>
+        <translation>-Inf</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2626"/>
+        <source>dB:<byte value="x9"/>%1 - %2</source>
+        <translation>Дб:<byte value="x9"/>%1 - %2</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2628"/>
+        <source>dB:<byte value="x9"/>%1</source>
+        <translation>Дб:<byte value="x9"/>%1</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2631"/>
+        <source>
+Phase:<byte value="x9"/>%1 - %2</source>
+        <translation>
+Фаза:<byte value="x9"/>%1 - %2</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2633"/>
+        <source>
+Phase:<byte value="x9"/>%1</source>
+        <translation>
+Фаза:<byte value="x9"/>%1</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="166"/>
+        <source>Window Overlap</source>
+        <translation>Перекрытие окон</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="176"/>
+        <source>Smoothing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="398"/>
+        <source>None</source>
+        <translation>Нет</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="390"/>
+        <source>25 %</source>
+        <translation>25 %</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="391"/>
+        <source>50 %</source>
+        <translation>50 %</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="392"/>
+        <source>75 %</source>
+        <translation>75 %</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="393"/>
+        <source>87.5 %</source>
+        <translation>87,5 %</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="394"/>
+        <source>93.75 %</source>
+        <translation>93,75 %</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="168"/>
+        <source>Normalize Visible Area</source>
+        <translation>Нормализовать видимую область</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="196"/>
+        <source>Bins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>dB^2</source>
+        <translation type="obsolete">Дб^2</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="1587"/>
+        <source>FFT cache failed</source>
+        <translation>Не удалось кэшировать FFT</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="1589"/>
+        <source>Failed to create the FFT model for this spectrogram.
+There may be insufficient memory or disc space to continue.</source>
+        <translation>Не удалось создать FFT-модель этой спектрограммы.
+Вероятно, не хватает памяти или дискового порстранства для продолжения.</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="378"/>
+        <source>dBV^2</source>
+        <translation>ДбВ^2</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="379"/>
+        <source>dBV</source>
+        <translation>ДбВ</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2662"/>
+        <source>43Hz</source>
+        <translation>43 Гц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrogramLayer.cpp" line="2807"/>
+        <source>%1Hz</source>
+        <translation>%1 Гц</translation>
+    </message>
+</context>
+<context>
+    <name>SpectrumLayer</name>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Colour</source>
+        <translation type="obsolete">Цвет</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Scale</source>
+        <translation type="obsolete">Масштаб</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Channels</source>
+        <translation type="obsolete">Каналы</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="111"/>
+        <source>Window Size</source>
+        <translation>Размер окна</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="112"/>
+        <source>Window Overlap</source>
+        <translation>Перекрытие окон</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Normalize</source>
+        <translation type="obsolete">Нормализовать</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Gain</source>
+        <translation type="obsolete">Усиление</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="128"/>
+        <source>Window</source>
+        <translation>Окно</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Energy Scale</source>
+        <translation type="obsolete">Масштаб энергии</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Black</source>
+        <translation type="obsolete">Чёрный</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Red</source>
+        <translation type="obsolete">Красный</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Blue</source>
+        <translation type="obsolete">Синий</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Green</source>
+        <translation type="obsolete">Зелёный</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Purple</source>
+        <translation type="obsolete">Пурпурный</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Orange</source>
+        <translation type="obsolete">Оранжевый</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Linear</source>
+        <translation type="obsolete">Линейный</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>dB</source>
+        <translation type="obsolete">Дб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="324"/>
+        <source>Mean</source>
+        <translation type="unfinished">Усреднённо</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="179"/>
+        <source>None</source>
+        <translation>Ничего</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="180"/>
+        <source>25 %</source>
+        <translation>25 %</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="181"/>
+        <source>50 %</source>
+        <translation>50 %</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="182"/>
+        <source>75 %</source>
+        <translation>75 %</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="183"/>
+        <source>87.5 %</source>
+        <translation>87,5 %</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="184"/>
+        <source>93.75 %</source>
+        <translation>93,75 %</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>&lt;unknown&gt;</source>
+        <translation type="obsolete">&lt;неизвестно&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="311"/>
+        <source>%1 - %2</source>
+        <translation>%1 - %2</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="283"/>
+        <source>%1 - %2 Hz</source>
+        <translation>%1 - %2 Гц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="285"/>
+        <source>%1 Hz</source>
+        <translation>%1 Гц</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="306"/>
+        <source>-Inf</source>
+        <translation>-Inf</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="313"/>
+        <source>%1</source>
+        <translation>%1</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="320"/>
+        <source>%1
+Bin:<byte value="x9"/>%2 (%3)
+%4 value:<byte value="x9"/>%5
+dB:<byte value="x9"/>%6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="323"/>
+        <source>First</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="324"/>
+        <source>Peak</source>
+        <translation>Пик</translation>
+    </message>
+    <message>
+        <location filename="../../layer/SpectrumLayer.cpp" line="329"/>
+        <source>%1
+Bin:<byte value="x9"/>%2 (%3)
+Value:<byte value="x9"/>%4
+dB:<byte value="x9"/>%5</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SubdividingMenu</name>
+    <message>
+        <location filename="../../widgets/SubdividingMenu.cpp" line="115"/>
+        <source>%1 - %2</source>
+        <translation>%1 - %2</translation>
+    </message>
+</context>
+<context>
+    <name>TextLayer</name>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="37"/>
+        <source>Empty Label</source>
+        <translation>Очистить метку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="73"/>
+        <source>Colour</source>
+        <translation>Цвет</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="119"/>
+        <source>Black</source>
+        <translation>Чёрный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="120"/>
+        <source>Red</source>
+        <translation>Красный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="121"/>
+        <source>Blue</source>
+        <translation>Синий</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="122"/>
+        <source>Green</source>
+        <translation>Зелёный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="123"/>
+        <source>Purple</source>
+        <translation>Пурпурный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="124"/>
+        <source>Orange</source>
+        <translation>Оранжевый</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="127"/>
+        <source>&lt;unknown&gt;</source>
+        <translation>&lt;неизвестно&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="406"/>
+        <source>&lt;no text&gt;</source>
+        <translation>&lt;без текста&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="223"/>
+        <source>In progress</source>
+        <translation>В процессе</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="236"/>
+        <source>Time:<byte value="x9"/>%1
+Height:<byte value="x9"/>%2
+Label:<byte value="x9"/>%3</source>
+        <translation>Время:<byte value="x9"/>%1
+Высота:<byte value="x9"/>%2
+Метка:<byte value="x9"/>%3</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="603"/>
+        <source>Enter label</source>
+        <translation>Введите метку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="604"/>
+        <source>Please enter a new label:</source>
+        <translation>Введите текст новой метки:</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="553"/>
+        <source>Drag Label</source>
+        <translation>Перетащите метку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="574"/>
+        <source>Move Label</source>
+        <translation>Переместите метку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="576"/>
+        <source>Move Label Horizontally</source>
+        <translation>Переместите по горизонтали</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="579"/>
+        <source>Move Label Vertically</source>
+        <translation>Переместите по вертикали</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="619"/>
+        <source>Drag Selection</source>
+        <translation>Перетащите выделение</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="644"/>
+        <source>Resize Selection</source>
+        <translation>Смените размер выделения</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="678"/>
+        <source>Delete Selection</source>
+        <translation>Удалите выделение</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="716"/>
+        <source>Paste</source>
+        <translation>Вставить</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TextLayer.cpp" line="749"/>
+        <source>New Point</source>
+        <translation>Новая точка</translation>
+    </message>
+</context>
+<context>
+    <name>Thumbwheel</name>
+    <message>
+        <location filename="../../widgets/Thumbwheel.cpp" line="227"/>
+        <source>%1: %2%3</source>
+        <translation>%1: %2%3</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/Thumbwheel.cpp" line="229"/>
+        <source>%2%3</source>
+        <translation>%2%3</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/Thumbwheel.cpp" line="325"/>
+        <source>New value for %1, from %2 to %3 %4:</source>
+        <translation>Новое значение для %1, от %2 до %3 %4:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/Thumbwheel.cpp" line="328"/>
+        <source>New value for %1, from %2 to %3:</source>
+        <translation>Новое значение для %1, от %2 до %3:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/Thumbwheel.cpp" line="333"/>
+        <source>Enter a new value from %1 to %2 %3:</source>
+        <translation>Введите новое значение от %1 до %2 %3:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/Thumbwheel.cpp" line="360"/>
+        <source>Enter a new value from %1 to %2:</source>
+        <translation>Введите новое значение от %1 до %2:</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/Thumbwheel.cpp" line="358"/>
+        <source>Enter new value</source>
+        <translation>Введите новое значение</translation>
+    </message>
+</context>
+<context>
+    <name>TimeInstantLayer</name>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="496"/>
+        <source>New Point</source>
+        <translation>Новая точка</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="76"/>
+        <source>Colour</source>
+        <translation>Цвет</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="77"/>
+        <source>Plot Type</source>
+        <translation>Тип графика</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="129"/>
+        <source>Black</source>
+        <translation>Чёрный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="130"/>
+        <source>Red</source>
+        <translation>Красный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="131"/>
+        <source>Blue</source>
+        <translation>Синий</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="132"/>
+        <source>Green</source>
+        <translation>Зелёный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="133"/>
+        <source>Purple</source>
+        <translation>Пурпурный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="134"/>
+        <source>Orange</source>
+        <translation>Оранжевый</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="139"/>
+        <source>Instants</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="140"/>
+        <source>Segmentation</source>
+        <translation>Сегментация</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="143"/>
+        <source>&lt;unknown&gt;</source>
+        <translation>&lt;неизвестно&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="245"/>
+        <source>In progress</source>
+        <translation>В процессе</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="247"/>
+        <source>No local points</source>
+        <translation>Нет локальных точек</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="258"/>
+        <source>Time:<byte value="x9"/>%1
+No label</source>
+        <translation>Время:<byte value="x9"/>%1
+Без метки</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="261"/>
+        <source>Time:<byte value="x9"/>%1
+Label:<byte value="x9"/>%2</source>
+        <translation>Время:<byte value="x9"/>%1
+Метка:<byte value="x9"/>%2</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="500"/>
+        <source>Draw Point</source>
+        <translation>Нарисовать точку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="527"/>
+        <source>Add Point at %1 s</source>
+        <translation>Добавить точку в %1 с</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="569"/>
+        <source>Drag Point</source>
+        <translation>Перетащить точку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="584"/>
+        <source>Move Point to %1 s</source>
+        <translation>Перетащить точку к %1 с</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="619"/>
+        <source>Edit Point</source>
+        <translation>Изменить точку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="635"/>
+        <source>Drag Selection</source>
+        <translation>Перетащить выделение</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="661"/>
+        <source>Resize Selection</source>
+        <translation>Изменить размер выделения</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="696"/>
+        <source>Delete Selection</source>
+        <translation>Удалить выделение</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeInstantLayer.cpp" line="734"/>
+        <source>Paste</source>
+        <translation>Вставить</translation>
+    </message>
+</context>
+<context>
+    <name>TimeRulerLayer</name>
+    <message>
+        <location filename="../../layer/TimeRulerLayer.cpp" line="65"/>
+        <source>Colour</source>
+        <translation>Цвет</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeRulerLayer.cpp" line="109"/>
+        <source>Black</source>
+        <translation>Чёрный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeRulerLayer.cpp" line="110"/>
+        <source>Red</source>
+        <translation>Красный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeRulerLayer.cpp" line="111"/>
+        <source>Blue</source>
+        <translation>Синий</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeRulerLayer.cpp" line="112"/>
+        <source>Green</source>
+        <translation>Зелёный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeRulerLayer.cpp" line="113"/>
+        <source>Purple</source>
+        <translation>Пурпурный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeRulerLayer.cpp" line="114"/>
+        <source>Orange</source>
+        <translation>Оранжевый</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeRulerLayer.cpp" line="117"/>
+        <source>&lt;unknown&gt;</source>
+        <translation>&lt;неизвестно&gt;</translation>
+    </message>
+</context>
+<context>
+    <name>TimeValueLayer</name>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="899"/>
+        <source>New Point</source>
+        <translation>Новая точка</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="87"/>
+        <source>Colour</source>
+        <translation>Цвет</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="88"/>
+        <source>Plot Type</source>
+        <translation>Тип графика</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="89"/>
+        <source>Vertical Scale</source>
+        <translation>Верт. масштаб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="90"/>
+        <source>Scale Units</source>
+        <translation>Единицы шкалы</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="184"/>
+        <source>Black</source>
+        <translation>Чёрный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="185"/>
+        <source>Red</source>
+        <translation>Красный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="186"/>
+        <source>Blue</source>
+        <translation>Синий</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="187"/>
+        <source>Green</source>
+        <translation>Зелёный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="188"/>
+        <source>Purple</source>
+        <translation>Пурпурный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="189"/>
+        <source>Orange</source>
+        <translation>Оранжевый</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="195"/>
+        <source>Points</source>
+        <translation>Точки</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="196"/>
+        <source>Stems</source>
+        <translation>Ножки</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="197"/>
+        <source>Connected Points</source>
+        <translation>Соединённые точки</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="198"/>
+        <source>Lines</source>
+        <translation>Линии</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="199"/>
+        <source>Curve</source>
+        <translation>Кривая</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="200"/>
+        <source>Segmentation</source>
+        <translation>Сегментация</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="205"/>
+        <source>Auto-Align</source>
+        <translation>Автовыравнивание</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Linear Scale</source>
+        <translation type="obsolete">Линейная шкала</translation>
+    </message>
+    <message>
+        <location filename="" line="7471221"/>
+        <source>Log Scale</source>
+        <translation type="obsolete">Логарифм. шкала</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="211"/>
+        <source>&lt;unknown&gt;</source>
+        <translation>&lt;неизвестно&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="370"/>
+        <source>In progress</source>
+        <translation>В процессе</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="372"/>
+        <source>No local points</source>
+        <translation>Нет локальных точек</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="385"/>
+        <source>Time:<byte value="x9"/>%1
+Value:<byte value="x9"/>%2%3
+No label</source>
+        <translation>Время:<byte value="x9"/>%1
+Значение:<byte value="x9"/>%2%3
+Без метки</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="390"/>
+        <source>Time:<byte value="x9"/>%1
+Value:<byte value="x9"/>%2%3
+Label:<byte value="x9"/>%4</source>
+        <translation>Время:<byte value="x9"/>%1
+Значение:<byte value="x9"/>%2%3
+Метка:<byte value="x9"/>%4</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="906"/>
+        <source>Draw Point</source>
+        <translation>Нарисовать точку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1012"/>
+        <source>Drag Point</source>
+        <translation>Перетащить точку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1078"/>
+        <source>Edit Point</source>
+        <translation>Изменить точку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1035"/>
+        <source>Relocate Point</source>
+        <translation>Переместить точку</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1038"/>
+        <source>Change Point Value</source>
+        <translation>Изменить значение точки</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1094"/>
+        <source>Drag Selection</source>
+        <translation>Перетащить выделение</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1120"/>
+        <source>Resize Selection</source>
+        <translation>Изменить размер выделения</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1155"/>
+        <source>Delete Selected Points</source>
+        <translation>Удалить выбранные точки</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1197"/>
+        <source>Paste</source>
+        <translation>Вставить</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1261"/>
+        <source>The items you are pasting do not have values.
+What values do you want to use for these items?</source>
+        <translation>У вставляемых объектов нет значений.
+Какие значения вы хотите для них использовать?</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1263"/>
+        <source>Some of the items you are pasting do not have values.
+What values do you want to use for these items?</source>
+        <translation>У некоторых вставляемых объектов нет значений.Какие значения вы хотите для них использовать?</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1269"/>
+        <source>Zero for all items</source>
+        <translation>Ноль для всех объектов</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1272"/>
+        <source>Whole numbers counting from 1</source>
+        <translation>Целые числа начиная с 1</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1275"/>
+        <source>Item&apos;s audio sample frame number</source>
+        <translation>Число звуковых выборок объекта</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1278"/>
+        <source>Item&apos;s time in seconds</source>
+        <translation>Время объекта в секундах</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1281"/>
+        <source>Duration from the item to the following item</source>
+        <translation>Длительность от одного объекта до следующего</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1284"/>
+        <source>Tempo in bpm derived from the duration</source>
+        <translation>Время в bpm, извлечённое из длительности</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1288"/>
+        <source>Value of the nearest existing item</source>
+        <translation>Значение ближайшего существующего объекта</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1293"/>
+        <source>Value extracted from the item&apos;s label (where possible)</source>
+        <translation>Значение, извлечённое из метки объекта (если возможно)</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="1302"/>
+        <source>Choose value calculation</source>
+        <translation>Выбрать вычисление значения</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="105"/>
+        <source>Scale</source>
+        <translation>Масштаб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="206"/>
+        <source>Linear</source>
+        <translation>Линейный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="207"/>
+        <source>Log</source>
+        <translation>Логарифм.</translation>
+    </message>
+    <message>
+        <location filename="../../layer/TimeValueLayer.cpp" line="208"/>
+        <source>+/-1</source>
+        <translation>+/-1</translation>
+    </message>
+</context>
+<context>
+    <name>TipDialog</name>
+    <message>
+        <location filename="../../widgets/TipDialog.cpp" line="35"/>
+        <source>Tip of the Day</source>
+        <translation>Совет дня</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/TipDialog.cpp" line="65"/>
+        <source>Show tip on startup</source>
+        <translation>Показывать советы при запуске</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/TipDialog.cpp" line="71"/>
+        <source>&lt;&lt; Previous</source>
+        <translation>&lt;&lt; Предыдущий</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/TipDialog.cpp" line="75"/>
+        <source>Next &gt;&gt;</source>
+        <translation>Следующий &gt;&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/TipDialog.cpp" line="79"/>
+        <source>Close</source>
+        <translation>Закрыть</translation>
+    </message>
+</context>
+<context>
+    <name>TransformFactory</name>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="773"/>
+        <source>%1: %2</source>
+        <translation>%1: %2</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="362"/>
+        <source>%1: Output %2</source>
+        <translation>%1: Выход %2</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="285"/>
+        <source>Analysis</source>
+        <translation>Анализ</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="385"/>
+        <source>Effects Data</source>
+        <translation>Данные эффектов</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="402"/>
+        <source>Effects</source>
+        <translation>Эффекты</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="409"/>
+        <source>Generators</source>
+        <translation>Генераторы</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="532"/>
+        <source>%1 &lt;%2&gt;</source>
+        <translation>%1 &lt;%2&gt;</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="193"/>
+        <source> [\(&lt;].*$</source>
+        <translation> [\(&lt;].*$</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="335"/>
+        <source>&lt;unknown maker&gt;</source>
+        <translation>&lt;неизвестный производитель&gt;</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="254"/>
+        <source>Extract features using &quot;%1&quot; plugin (from %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="257"/>
+        <source>Extract features using &quot;%1&quot; output of &quot;%2&quot; plugin (from %3)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="262"/>
+        <source>%1 using &quot;%2&quot; plugin (from %3)</source>
+        <translation>%1 используя расширение &quot;%2&quot; (из %3)</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="265"/>
+        <source>%1 using &quot;%2&quot; output of &quot;%3&quot; plugin (from %4)</source>
+        <translation>%1 используя вывод &quot;%2&quot; расширения &quot;%3&quot; (из %4)</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="374"/>
+        <source>Extract &quot;%1&quot; data output from &quot;%2&quot; effect plugin (from %3)</source>
+        <translation>Извлечь &quot;%1&quot; данные вывода из расширения эффектов &quot;%2&quot; (из %3)</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="379"/>
+        <source>Extract data output %1 from &quot;%2&quot; effect plugin (from %3)</source>
+        <translation>Извлечь данные вывода %1 из расширения эффектов &quot;%2&quot; (из %3)</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="405"/>
+        <source>Transform audio signal with &quot;%1&quot; effect plugin (from %2)</source>
+        <translation>Трансформировать звуковой сигнал расширением эффектов &quot;%1&quot; (из %2)</translation>
+    </message>
+    <message>
+        <location filename="../transform/TransformFactory.cpp" line="411"/>
+        <source>Generate audio signal using &quot;%1&quot; plugin (from %2)</source>
+        <translation>Создать звуковой сигнал при помощи расширения &quot;%1&quot; (из %2)</translation>
+    </message>
+</context>
+<context>
+    <name>View</name>
+    <message>
+        <location filename="../../view/View.cpp" line="81"/>
+        <source>Global Scroll</source>
+        <translation>Глобальная прокрутка</translation>
+    </message>
+    <message>
+        <location filename="../../view/View.cpp" line="82"/>
+        <source>Global Zoom</source>
+        <translation>Глобальный масштаб</translation>
+    </message>
+    <message>
+        <location filename="../../view/View.cpp" line="83"/>
+        <source>Follow Playback</source>
+        <translation>Следовать за воспроизведением</translation>
+    </message>
+    <message>
+        <location filename="../../view/View.cpp" line="122"/>
+        <source>Scroll</source>
+        <translation>Прокручивать</translation>
+    </message>
+    <message>
+        <location filename="../../view/View.cpp" line="123"/>
+        <source>Page</source>
+        <translation>Постранично</translation>
+    </message>
+    <message>
+        <location filename="../../view/View.cpp" line="124"/>
+        <source>Off</source>
+        <translation>Выключить</translation>
+    </message>
+    <message>
+        <location filename="../../view/View.cpp" line="127"/>
+        <source>&lt;unknown&gt;</source>
+        <translation>&lt;неизвестно&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../view/View.cpp" line="1655"/>
+        <source>Waiting for layers to be ready...</source>
+        <translation>Ожидание готовности слоёв...</translation>
+    </message>
+    <message>
+        <location filename="../../view/View.cpp" line="1685"/>
+        <source>Cancel</source>
+        <translation>Отменить</translation>
+    </message>
+    <message>
+        <location filename="../../view/View.cpp" line="1684"/>
+        <source>Rendering image...</source>
+        <translation>Отрисовывается изображение...</translation>
+    </message>
+</context>
+<context>
+    <name>ViewManager::SetSelectionCommand</name>
+    <message>
+        <location filename="../../view/ViewManager.cpp" line="224"/>
+        <source>Clear Selection</source>
+        <translation>Снять выделение</translation>
+    </message>
+    <message>
+        <location filename="../../view/ViewManager.cpp" line="225"/>
+        <source>Select</source>
+        <translation>Выделить</translation>
+    </message>
+</context>
+<context>
+    <name>WaveformLayer</name>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="110"/>
+        <source>Colour</source>
+        <translation>Цвет</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="134"/>
+        <source>Scale</source>
+        <translation>Масштаб по Y</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="112"/>
+        <source>Gain</source>
+        <translation>Усиление</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="113"/>
+        <source>Normalize Visible Area</source>
+        <translation>Нормализовать видимую область</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="114"/>
+        <source>Channels</source>
+        <translation>Каналы</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="209"/>
+        <source>Black</source>
+        <translation>Чёрный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="210"/>
+        <source>Red</source>
+        <translation>Красный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="211"/>
+        <source>Blue</source>
+        <translation>Синий</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="212"/>
+        <source>Green</source>
+        <translation>Зелёный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="213"/>
+        <source>Purple</source>
+        <translation>Пурпурный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="214"/>
+        <source>Orange</source>
+        <translation>Оранжевый</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="220"/>
+        <source>Linear</source>
+        <translation>Линейный</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="221"/>
+        <source>Meter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="240"/>
+        <source>dB</source>
+        <translation>Дб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="228"/>
+        <source>Separate</source>
+        <translation>Отдельно</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="229"/>
+        <source>Mean</source>
+        <translation>Усреднённо</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="230"/>
+        <source>Butterfly</source>
+        <translation>V-образно</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="233"/>
+        <source>&lt;unknown&gt;</source>
+        <translation>&lt;неизвестно&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="936"/>
+        <source>Time:<byte value="x9"/>%1 - %2</source>
+        <translation>Время:<byte value="x9"/>%1 - %2</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="940"/>
+        <source>Time:<byte value="x9"/>%1</source>
+        <translation>Время:<byte value="x9"/>%1</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="960"/>
+        <source>Level:</source>
+        <translation>Уровень:</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="962"/>
+        <source>Left:</source>
+        <translation>Левый:</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="963"/>
+        <source>Right:</source>
+        <translation>Правый:</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="964"/>
+        <source>Channel %1</source>
+        <translation>Канал %1</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="988"/>
+        <source>
+%1<byte value="x9"/>%2 - %3 (%4 dB peak)</source>
+        <translation>
+%1<byte value="x9"/>%2 - %3 (пик в %4 Дб)</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="991"/>
+        <source>
+%1<byte value="x9"/>%2 (%3 dB peak)</source>
+        <translation>
+%1<byte value="x9"/>%2 (пик в %3 Дб)</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="1105"/>
+        <source>0dB</source>
+        <translation>0 Дб</translation>
+    </message>
+    <message>
+        <location filename="../../layer/WaveformLayer.cpp" line="1107"/>
+        <source>-Inf</source>
+        <translation>-Inf</translation>
+    </message>
+</context>
+<context>
+    <name>WindowShapePreview</name>
+    <message>
+        <location filename="../../widgets/WindowShapePreview.cpp" line="109"/>
+        <source>V / time</source>
+        <translation>V / время</translation>
+    </message>
+    <message>
+        <location filename="../../widgets/WindowShapePreview.cpp" line="193"/>
+        <source>dB / freq</source>
+        <translation>Дб / частота</translation>
+    </message>
+</context>
+</TS>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/tips_en.xml	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,73 @@
+
+<!-- Note: this tip file is not actually used, the tip of the day
+dialog has been disabled for the moment because I wasn't liking it
+enough to take the trouble to finish the tips text... -->
+
+<tips caption="Tip of the Day">
+<tip>
+<html>
+<p><b>Welcome to Sonic Visualiser!</b></p> <p>Sonic Visualiser is a
+complex application, but it's easy enough to get started with.</p>
+<p>Try importing an audio file and using the Pane menu to add some
+different views of it.</p> <p>Check out the links on the Help menu for
+tutorials and other documentation!</p>
+</html>
+</tip>
+<tip>
+<html>
+<p>Sonic Visualiser's window is organised into "panes" and
+"layers".  To begin with, you have one pane.  Import an audio
+file to see it displayed in a waveform layer on that pane.</p>
+</html>
+</tip>
+<tip>
+<html>
+<p>Each pane can contain any number of layers, which appear stacked
+from "front" to "back" on the same timeline.  A layer can contain a
+view of audio, or of points (time instants) or data plots (time-values).</p>
+</html>
+</tip>
+<tip>
+<html>
+<p>There's a "layer property box" to the right of each pane, with one
+tab for each of the layers on that pane.  Click on a layer's tab to
+bring that layer to the front.  You can then adjust its colour and
+other display properties in the property box.
+
+The first tab is always for the pane itself, which has a few
+adjustable properties of its own.</p>
+</html>
+</tip>
+<tip>
+<html>
+<p>If you have more than one pane, only one of them will be "current",
+marked with a black bar at the left side.  Just click on another pane
+to make it current.  Most editing operations affect the layer that's
+at the front of the current pane.</p>
+</html>
+</tip>
+<tip>
+<html>
+<p>You can use different zoom levels for different panes by un-checking
+the Global Zoom control for one of them.  By default, all panes will
+zoom and scroll together.</p>
+</html>
+</tip>
+<tip>
+<html>
+<p>You can speed up and slow down playback using the Playback Speedup
+control in the bottom-right of the window.</p>
+</html>
+</tip>
+<tip>
+<html>
+<p>The Transforms menu lists things you can do to extract features from
+or process your audio.  The available outputs of any Vamp
+feature-extraction plugins or LADSPA audio effects plugins you have
+will show up here.</p>
+</html>
+</tip>
+
+</tips>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/icons/README	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,3 @@
+Icons are from various GPL'd sources, including the GIMP image editor,
+KDE crystalsvg icon set, Rosegarden audio and MIDI sequencer, and Hydrogen
+drum machine.  Some modifications and new drawings by Chris Cannam.
Binary file icons/annotation.png has changed
Binary file icons/colour3d.png has changed
Binary file icons/cross.png has changed
Binary file icons/draw-curve.png has changed
Binary file icons/draw.png has changed
Binary file icons/editcopy.png has changed
Binary file icons/editcut.png has changed
Binary file icons/editdelete.png has changed
Binary file icons/editpaste.png has changed
Binary file icons/exit.png has changed
Binary file icons/fader_background.png has changed
Binary file icons/fader_knob.png has changed
Binary file icons/fader_knob_red.png has changed
Binary file icons/fader_leds.png has changed
Binary file icons/faders.png has changed
Binary file icons/ffwd-end.png has changed
Binary file icons/ffwd.png has changed
Binary file icons/fileclose.png has changed
Binary file icons/filenew-22.png has changed
Binary file icons/filenew.png has changed
Binary file icons/fileopen-22.png has changed
Binary file icons/fileopen.png has changed
Binary file icons/fileopenaudio.png has changed
Binary file icons/fileopensession.png has changed
Binary file icons/filesave-22.png has changed
Binary file icons/filesave.png has changed
Binary file icons/filesaveas-22.png has changed
Binary file icons/filesaveas.png has changed
Binary file icons/help.png has changed
Binary file icons/hh.gif has changed
Binary file icons/hh.png has changed
Binary file icons/info.png has changed
Binary file icons/instants.png has changed
Binary file icons/measure.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/icons/measure1cursor.xbm	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,16 @@
+#define measure1cursor_width 32
+#define measure1cursor_height 32
+#define measure1cursor_x_hot 15
+#define measure1cursor_y_hot 14
+static unsigned char measure1cursor_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+   0x00, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+   0x00, 0x98, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00,
+   0x00, 0x83, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/icons/measure1mask.xbm	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,14 @@
+#define measure1mask_width 32
+#define measure1mask_height 32
+static unsigned char measure1mask_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
+   0x00, 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf8, 0x01, 0x00,
+   0x00, 0xfc, 0x01, 0x00, 0x00, 0xde, 0x01, 0x00, 0x00, 0xcf, 0x01, 0x00,
+   0x80, 0xc7, 0x01, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00,
+   0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/icons/measure2cursor.xbm	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,16 @@
+#define measure2cursor_width 32
+#define measure2cursor_height 32
+#define measure2cursor_x_hot 16
+#define measure2cursor_y_hot 17
+static unsigned char measure2cursor_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07,
+   0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x61, 0x00,
+   0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0f, 0x00,
+   0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00,
+   0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/icons/measure2mask.xbm	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,14 @@
+#define measure2mask_width 32
+#define measure2mask_height 32
+static unsigned char measure2mask_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07,
+   0x00, 0x00, 0xfc, 0x07, 0x00, 0x80, 0xe3, 0x01, 0x00, 0x80, 0xf3, 0x00,
+   0x00, 0x80, 0x7b, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x1f, 0x00,
+   0x00, 0x80, 0x0f, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0x03, 0x00,
+   0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Binary file icons/melodogram.png has changed
Binary file icons/mono.png has changed
Binary file icons/move.png has changed
Binary file icons/navigate.png has changed
Binary file icons/new.png has changed
Binary file icons/notes.png has changed
Binary file icons/pane.png has changed
Binary file icons/playloop.png has changed
Binary file icons/playpause-orig.png has changed
Binary file icons/playpause.png has changed
Binary file icons/playselection.png has changed
Binary file icons/playselectionloop.png has changed
Binary file icons/redo.png has changed
Binary file icons/rewind-start.png has changed
Binary file icons/rewind.png has changed
Binary file icons/select.png has changed
Binary file icons/sharpen.png has changed
Binary file icons/solo.png has changed
Binary file icons/speaker.png has changed
Binary file icons/spectrogram-22x22.png has changed
Binary file icons/spectrogram.png has changed
Binary file icons/spectrum.png has changed
Binary file icons/stereo.png has changed
Binary file icons/sv-128x128.png has changed
Binary file icons/sv-16x16.png has changed
Binary file icons/sv-22x22.png has changed
Binary file icons/sv-24x24.png has changed
Binary file icons/sv-32x32.png has changed
Binary file icons/sv-48x48.png has changed
Binary file icons/sv-64x64.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/icons/sv-icon-light.svg	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,507 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg1900"
+   sodipodi:version="0.32"
+   inkscape:version="0.44.1"
+   sodipodi:docbase="/work/sonic-visualiser/sv/icons"
+   sodipodi:docname="sv-icon-light.svg"
+   inkscape:export-filename="/work/sonic-visualiser/test-d1.png"
+   inkscape:export-xdpi="106.65"
+   inkscape:export-ydpi="106.65">
+  <defs
+     id="defs1902">
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3958"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8) translate(12.5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path3955"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3952"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.4) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path3949"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.4) rotate(180) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Sstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Sstart"
+       style="overflow:visible">
+      <path
+         id="path3946"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.2) translate(6,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Send"
+       style="overflow:visible;">
+      <path
+         id="path3943"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.2) rotate(180) translate(6,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lstart"
+       style="overflow:visible">
+      <path
+         id="path3940"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) translate(1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lend"
+       style="overflow:visible;">
+      <path
+         id="path3937"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) rotate(180) translate(1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mstart"
+       style="overflow:visible">
+      <path
+         id="path3934"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) translate(0,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;">
+      <path
+         id="path3931"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) rotate(180) translate(0,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Sstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Sstart"
+       style="overflow:visible">
+      <path
+         id="path3928"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.3) translate(-2.3,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Send"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Send"
+       style="overflow:visible;">
+      <path
+         id="path3925"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.3) rotate(180) translate(-2.3,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Tail"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Tail"
+       style="overflow:visible">
+      <g
+         id="g3910"
+         transform="scale(-1.2)">
+        <path
+           id="path3912"
+           d="M -3.8048674,-3.9585227 L 0.54352094,0"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path3914"
+           d="M -1.2866832,-3.9585227 L 3.0617053,0"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path3916"
+           d="M 1.3053582,-3.9585227 L 5.6537466,0"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path3918"
+           d="M -3.8048674,4.1775838 L 0.54352094,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path3920"
+           d="M -1.2866832,4.1775838 L 3.0617053,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path3922"
+           d="M 1.3053582,4.1775838 L 5.6537466,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceIn"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceIn">
+      <g
+         id="g3904">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square"
+           d="M 0,0 L 2,0"
+           id="path2306" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 L 13,4 L 9,0 13,-4 L 0,0 z "
+           id="path2302" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 L 0,40"
+           id="path2304" />
+      </g>
+    </marker>
+    <marker
+       inkscape:stockid="TriangleOutS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutS"
+       style="overflow:visible">
+      <path
+         id="path3854"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutM"
+       style="overflow:visible">
+      <path
+         id="path3857"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleOutL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutL"
+       style="overflow:visible">
+      <path
+         id="path3860"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleInS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleInS"
+       style="overflow:visible">
+      <path
+         id="path3863"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(-0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleInM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleInM"
+       style="overflow:visible">
+      <path
+         id="path3866"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(-0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleInL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleInL"
+       style="overflow:visible">
+      <path
+         id="path3869"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(-0.8)" />
+    </marker>
+    <marker
+       inkscape:stockid="DiamondS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="DiamondS"
+       style="overflow:visible">
+      <path
+         id="path3872"
+         d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="DiamondM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="DiamondM"
+       style="overflow:visible">
+      <path
+         id="path3875"
+         d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="DiamondL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="DiamondL"
+       style="overflow:visible">
+      <path
+         id="path3878"
+         d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8)" />
+    </marker>
+    <marker
+       inkscape:stockid="SquareS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="SquareS"
+       style="overflow:visible">
+      <path
+         id="path3881"
+         d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="SquareM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="SquareM"
+       style="overflow:visible">
+      <path
+         id="path3884"
+         d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="SquareL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="SquareL"
+       style="overflow:visible">
+      <path
+         id="path3887"
+         d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8)" />
+    </marker>
+    <marker
+       inkscape:stockid="Dot_s"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Dot_s"
+       style="overflow:visible">
+      <path
+         id="path3890"
+         d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;marker-end:none"
+         transform="scale(0.2) translate(7.4, 1)" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceOut"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceOut">
+      <g
+         id="g2300">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square"
+           d="M 0,0 L -2,0"
+           id="path2316" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 L -13,4 L -9,0 -13,-4 L 0,0 z "
+           id="path2312" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 L 0,40"
+           id="path2314" />
+      </g>
+    </marker>
+    <marker
+       inkscape:stockid="Dot_l"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Dot_l"
+       style="overflow:visible">
+      <path
+         id="path3896"
+         d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;marker-end:none"
+         transform="scale(0.8) translate(7.4, 1)" />
+    </marker>
+    <marker
+       inkscape:stockid="Dot_m"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Dot_m"
+       style="overflow:visible">
+      <path
+         id="path3893"
+         d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;marker-end:none"
+         transform="scale(0.4) translate(7.4, 1)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.197802"
+     inkscape:cx="16.018908"
+     inkscape:cy="13.609254"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="816"
+     inkscape:window-height="606"
+     inkscape:window-x="145"
+     inkscape:window-y="134" />
+  <metadata
+     id="metadata1905">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#d45500;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 3.905299,16.01472 C 27.5,16.01472 27.5,16.01472 27.5,16.01472"
+       id="path4036" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#d8e5f2;stroke-width:1.356;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:1.39999998;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 4.189383,16.015203 C 7.6265694,16.015203 8.0726528,16.025708 8.0726528,16.025708 C 9.66349,9.1090346 9.741433,8.3087074 10.172784,15.048932 C 10.831635,26.830929 11.416632,20.601324 12.258324,15.76545 C 13.844917,0.39957958 14.006502,6.1759314 14.342565,9.4067063 C 15.634829,25.384548 15.579075,28.965284 16.269833,23.658757 C 16.783168,19.715219 18.310939,3.0919969 18.584891,7.6743646 C 20.490285,25.887346 20.546625,24.84451 21.131971,20.132265 C 23.062537,1.6773601 22.472829,16.437356 23.676672,16.115011 C 27.08449,16.115011 27.026616,16.025708 27.026616,16.025708 L 27.47205,16.025708"
+       id="path3783"
+       sodipodi:nodetypes="cccccsccccc" />
+    <rect
+       style="fill:none;stroke:#d45500;stroke-width:2;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect3775"
+       width="25.004908"
+       height="24.915606"
+       x="3.4828262"
+       y="3.5122664" />
+  </g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/icons/sv-icon.svg	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,507 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg1900"
+   sodipodi:version="0.32"
+   inkscape:version="0.44.1"
+   sodipodi:docbase="/work/sonic-visualiser"
+   sodipodi:docname="sv-icon.svg"
+   inkscape:export-filename="/work/sonic-visualiser/test-d1.png"
+   inkscape:export-xdpi="106.65"
+   inkscape:export-ydpi="106.65">
+  <defs
+     id="defs1902">
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3958"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8) translate(12.5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path3955"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3952"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.4) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path3949"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.4) rotate(180) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Sstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Sstart"
+       style="overflow:visible">
+      <path
+         id="path3946"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.2) translate(6,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Send"
+       style="overflow:visible;">
+      <path
+         id="path3943"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.2) rotate(180) translate(6,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lstart"
+       style="overflow:visible">
+      <path
+         id="path3940"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) translate(1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lend"
+       style="overflow:visible;">
+      <path
+         id="path3937"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) rotate(180) translate(1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mstart"
+       style="overflow:visible">
+      <path
+         id="path3934"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) translate(0,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;">
+      <path
+         id="path3931"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) rotate(180) translate(0,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Sstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Sstart"
+       style="overflow:visible">
+      <path
+         id="path3928"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.3) translate(-2.3,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Send"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Send"
+       style="overflow:visible;">
+      <path
+         id="path3925"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.3) rotate(180) translate(-2.3,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Tail"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Tail"
+       style="overflow:visible">
+      <g
+         id="g3910"
+         transform="scale(-1.2)">
+        <path
+           id="path3912"
+           d="M -3.8048674,-3.9585227 L 0.54352094,0"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path3914"
+           d="M -1.2866832,-3.9585227 L 3.0617053,0"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path3916"
+           d="M 1.3053582,-3.9585227 L 5.6537466,0"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path3918"
+           d="M -3.8048674,4.1775838 L 0.54352094,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path3920"
+           d="M -1.2866832,4.1775838 L 3.0617053,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path3922"
+           d="M 1.3053582,4.1775838 L 5.6537466,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceIn"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceIn">
+      <g
+         id="g3904">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square"
+           d="M 0,0 L 2,0"
+           id="path2306" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 L 13,4 L 9,0 13,-4 L 0,0 z "
+           id="path2302" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 L 0,40"
+           id="path2304" />
+      </g>
+    </marker>
+    <marker
+       inkscape:stockid="TriangleOutS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutS"
+       style="overflow:visible">
+      <path
+         id="path3854"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutM"
+       style="overflow:visible">
+      <path
+         id="path3857"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleOutL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutL"
+       style="overflow:visible">
+      <path
+         id="path3860"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleInS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleInS"
+       style="overflow:visible">
+      <path
+         id="path3863"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(-0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleInM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleInM"
+       style="overflow:visible">
+      <path
+         id="path3866"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(-0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleInL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleInL"
+       style="overflow:visible">
+      <path
+         id="path3869"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(-0.8)" />
+    </marker>
+    <marker
+       inkscape:stockid="DiamondS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="DiamondS"
+       style="overflow:visible">
+      <path
+         id="path3872"
+         d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="DiamondM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="DiamondM"
+       style="overflow:visible">
+      <path
+         id="path3875"
+         d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="DiamondL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="DiamondL"
+       style="overflow:visible">
+      <path
+         id="path3878"
+         d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8)" />
+    </marker>
+    <marker
+       inkscape:stockid="SquareS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="SquareS"
+       style="overflow:visible">
+      <path
+         id="path3881"
+         d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="SquareM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="SquareM"
+       style="overflow:visible">
+      <path
+         id="path3884"
+         d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="SquareL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="SquareL"
+       style="overflow:visible">
+      <path
+         id="path3887"
+         d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8)" />
+    </marker>
+    <marker
+       inkscape:stockid="Dot_s"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Dot_s"
+       style="overflow:visible">
+      <path
+         id="path3890"
+         d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;marker-end:none"
+         transform="scale(0.2) translate(7.4, 1)" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceOut"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceOut">
+      <g
+         id="g2300">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square"
+           d="M 0,0 L -2,0"
+           id="path2316" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 L -13,4 L -9,0 -13,-4 L 0,0 z "
+           id="path2312" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 L 0,40"
+           id="path2314" />
+      </g>
+    </marker>
+    <marker
+       inkscape:stockid="Dot_l"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Dot_l"
+       style="overflow:visible">
+      <path
+         id="path3896"
+         d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;marker-end:none"
+         transform="scale(0.8) translate(7.4, 1)" />
+    </marker>
+    <marker
+       inkscape:stockid="Dot_m"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Dot_m"
+       style="overflow:visible">
+      <path
+         id="path3893"
+         d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;marker-end:none"
+         transform="scale(0.4) translate(7.4, 1)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.197802"
+     inkscape:cx="16.018908"
+     inkscape:cy="13.653906"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="816"
+     inkscape:window-height="606"
+     inkscape:window-x="145"
+     inkscape:window-y="175" />
+  <metadata
+     id="metadata1905">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#d45500;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 3.905299,16.01472 C 27.5,16.01472 27.5,16.01472 27.5,16.01472"
+       id="path4036" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1.356;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:1.39999998;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 4.189383,16.015203 C 7.6265694,16.015203 8.0726528,16.025708 8.0726528,16.025708 C 9.66349,9.1090346 9.741433,8.3087074 10.172784,15.048932 C 10.831635,26.830929 11.416632,20.601324 12.258324,15.76545 C 13.844917,0.39957958 14.006502,6.1759314 14.342565,9.4067063 C 15.634829,25.384548 15.579075,28.965284 16.269833,23.658757 C 16.783168,19.715219 18.310939,3.0919969 18.584891,7.6743646 C 20.490285,25.887346 20.546625,24.84451 21.131971,20.132265 C 23.062537,1.6773601 22.472829,16.437356 23.676672,16.115011 C 27.08449,16.115011 27.026616,16.025708 27.026616,16.025708 L 27.47205,16.025708"
+       id="path3783"
+       sodipodi:nodetypes="cccccsccccc" />
+    <rect
+       style="fill:none;stroke:#d45500;stroke-width:2;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect3775"
+       width="25.004908"
+       height="24.915606"
+       x="3.4828262"
+       y="3.5122664" />
+  </g>
+</svg>
Binary file icons/sv-macicon.icns has changed
Binary file icons/svicon16.png has changed
Binary file icons/svicon32.png has changed
Binary file icons/text.png has changed
Binary file icons/timeruler.png has changed
Binary file icons/undo.png has changed
Binary file icons/values.png has changed
Binary file icons/waveform.png has changed
Binary file icons/zoom-fit.png has changed
Binary file icons/zoom-in.png has changed
Binary file icons/zoom-out.png has changed
Binary file icons/zoom.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/MainWindow.cpp	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,2067 @@
+/* -*- 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 "../version.h"
+
+#include "MainWindow.h"
+#include "framework/Document.h"
+#include "PreferencesDialog.h"
+
+#include "view/Pane.h"
+#include "view/PaneStack.h"
+#include "data/model/WaveFileModel.h"
+#include "data/model/SparseOneDimensionalModel.h"
+#include "data/model/FFTModel.h"
+#include "base/StorageAdviser.h"
+#include "view/ViewManager.h"
+#include "base/Preferences.h"
+#include "layer/WaveformLayer.h"
+#include "layer/TimeRulerLayer.h"
+#include "layer/TimeInstantLayer.h"
+#include "layer/TimeValueLayer.h"
+#include "layer/Colour3DPlotLayer.h"
+#include "layer/SliceLayer.h"
+#include "layer/SliceableLayer.h"
+#include "widgets/Fader.h"
+#include "view/Overview.h"
+#include "widgets/PropertyBox.h"
+#include "widgets/PropertyStack.h"
+#include "widgets/AudioDial.h"
+#include "widgets/IconLoader.h"
+#include "widgets/LayerTree.h"
+#include "widgets/ListInputDialog.h"
+#include "widgets/SubdividingMenu.h"
+#include "widgets/NotifyingPushButton.h"
+#include "widgets/KeyReference.h"
+#include "audioio/AudioCallbackPlaySource.h"
+#include "audioio/AudioCallbackPlayTarget.h"
+#include "audioio/AudioTargetFactory.h"
+#include "audioio/PlaySpeedRangeMapper.h"
+#include "data/fileio/DataFileReaderFactory.h"
+#include "data/fileio/PlaylistFileReader.h"
+#include "data/fileio/WavFileWriter.h"
+#include "data/fileio/CSVFileWriter.h"
+#include "data/fileio/BZipFileDevice.h"
+#include "data/fileio/FileSource.h"
+#include "data/fft/FFTDataServer.h"
+#include "base/RecentFiles.h"
+#include "transform/TransformFactory.h"
+#include "transform/ModelTransformerFactory.h"
+#include "base/PlayParameterRepository.h"
+#include "base/XmlExportable.h"
+#include "widgets/CommandHistory.h"
+#include "base/Profiler.h"
+#include "base/Clipboard.h"
+#include "base/UnitDatabase.h"
+#include "layer/ColourDatabase.h"
+#include "data/osc/OSCQueue.h"
+
+//!!!
+#include "data/model/AggregateWaveModel.h"
+
+// For version information
+#include "vamp/vamp.h"
+#include "vamp-sdk/PluginBase.h"
+#include "plugin/api/ladspa.h"
+#include "plugin/api/dssi.h"
+
+#include <QApplication>
+#include <QMessageBox>
+#include <QGridLayout>
+#include <QLabel>
+#include <QAction>
+#include <QMenuBar>
+#include <QToolBar>
+#include <QToolButton>
+#include <QButtonGroup>
+#include <QInputDialog>
+#include <QStatusBar>
+#include <QTreeView>
+#include <QFile>
+#include <QFileInfo>
+#include <QDir>
+#include <QTextStream>
+#include <QProcess>
+#include <QShortcut>
+#include <QSettings>
+#include <QDateTime>
+#include <QProcess>
+#include <QCheckBox>
+#include <QRegExp>
+#include <QScrollArea>
+
+#include <iostream>
+#include <cstdio>
+#include <errno.h>
+
+using std::cerr;
+using std::endl;
+
+using std::vector;
+using std::map;
+using std::set;
+
+
+MainWindow::MainWindow(bool withAudioOutput, bool withOSCSupport) :
+    MainWindowBase(withAudioOutput, withOSCSupport, false),
+    m_overview(0),
+    m_mainMenusCreated(false),
+    m_playbackMenu(0),
+    m_recentFilesMenu(0),
+    m_rightButtonMenu(0),
+    m_rightButtonPlaybackMenu(0),
+    m_deleteSelectedAction(0),
+    m_ffwdAction(0),
+    m_rwdAction(0),
+    m_preferencesDialog(0),
+    m_layerTreeView(0),
+    m_keyReference(new KeyReference()),
+    m_displayMode(WaveformMode)
+{
+    setWindowTitle(tr("Vect"));
+
+    StorageAdviser::setFixedRecommendation
+        (StorageAdviser::Recommendation(StorageAdviser::UseDisc |
+                                        StorageAdviser::ConserveSpace));
+
+    UnitDatabase *udb = UnitDatabase::getInstance();
+    udb->registerUnit("Hz");
+    udb->registerUnit("dB");
+    udb->registerUnit("s");
+
+    ColourDatabase *cdb = ColourDatabase::getInstance();
+    cdb->addColour(Qt::black, tr("Black"));
+    cdb->addColour(Qt::darkRed, tr("Red"));
+    cdb->addColour(Qt::darkBlue, tr("Blue"));
+    cdb->addColour(Qt::darkGreen, tr("Green"));
+    cdb->addColour(QColor(200, 50, 255), tr("Purple"));
+    cdb->addColour(QColor(255, 150, 50), tr("Orange"));
+    cdb->setUseDarkBackground(cdb->addColour(Qt::white, tr("White")), true);
+    cdb->setUseDarkBackground(cdb->addColour(Qt::red, tr("Bright Red")), true);
+    cdb->setUseDarkBackground(cdb->addColour(QColor(30, 150, 255), tr("Bright Blue")), true);
+    cdb->setUseDarkBackground(cdb->addColour(Qt::green, tr("Bright Green")), true);
+    cdb->setUseDarkBackground(cdb->addColour(QColor(225, 74, 255), tr("Bright Purple")), true);
+    cdb->setUseDarkBackground(cdb->addColour(QColor(255, 188, 80), tr("Bright Orange")), true);
+
+    Preferences::getInstance()->setResampleOnLoad(true);
+    Preferences::getInstance()->setSpectrogramSmoothing
+        (Preferences::SpectrogramInterpolated);
+
+    QSettings settings;
+
+    settings.beginGroup("LayerDefaults");
+
+    settings.setValue("waveform",
+                      QString("<layer scale=\"%1\" channelMode=\"%2\"/>")
+                      .arg(int(WaveformLayer::MeterScale))
+//                      .arg(int(WaveformLayer::LinearScale))
+                      .arg(int(WaveformLayer::MergeChannels)));
+
+    settings.setValue("timevalues",
+                      QString("<layer plotStyle=\"%1\"/>")
+                      .arg(int(TimeValueLayer::PlotStems)));
+
+    settings.setValue("spectrogram",
+                      QString("<layer channel=\"-1\" windowSize=\"2048\" windowHopLevel=\"2\"/>"));
+
+    settings.setValue("melodicrange",
+                      QString("<layer channel=\"-1\" gain=\"10\" normalizeVisibleArea=\"false\" normalizeColumns=\"false\" minFrequency=\"100\" maxFrequency=\"1200\" windowSize=\"4096\" windowOverlap=\"75\" binDisplay=\"0\" />"));
+
+    settings.endGroup();
+
+    settings.beginGroup("MainWindow");
+    settings.setValue("showstatusbar", false);
+    settings.endGroup();
+
+    m_viewManager->setAlignMode(true);
+    m_viewManager->setPlaySoloMode(true);
+    m_viewManager->setToolMode(ViewManager::NavigateMode);
+    m_viewManager->setZoomWheelsEnabled(false);
+    m_viewManager->setIlluminateLocalFeatures(false);
+    m_viewManager->setShowWorkTitle(true);
+
+#ifndef __APPLE__
+    m_viewManager->setGlobalDarkBackground(true);
+#endif
+    
+    QFrame *frame = new QFrame;
+    setCentralWidget(frame);
+
+    QGridLayout *layout = new QGridLayout;
+    
+    m_descriptionLabel = new QLabel;
+
+    QScrollArea *scroll = new QScrollArea(frame);
+    scroll->setWidgetResizable(true);
+    scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    scroll->setFrameShape(QFrame::NoFrame);
+
+    m_paneStack->setLayoutStyle(PaneStack::NoPropertyStacks);
+    scroll->setWidget(m_paneStack);
+    
+    QButtonGroup *bg = new QButtonGroup;
+    IconLoader il;
+
+    QFrame *buttonFrame = new QFrame;
+    QHBoxLayout *buttonLayout = new QHBoxLayout;
+    buttonLayout->setSpacing(0);
+    buttonLayout->setMargin(0);
+    buttonFrame->setLayout(buttonLayout);
+
+    QToolButton *button = new QToolButton;
+    button->setIcon(il.load("waveform"));
+    button->setCheckable(true);
+    button->setChecked(true);
+    button->setAutoRaise(true);
+    bg->addButton(button);
+    buttonLayout->addWidget(button);
+    connect(button, SIGNAL(clicked()), this, SLOT(waveformModeSelected()));
+
+    button = new QToolButton;
+    button->setIcon(il.load("values"));
+    button->setCheckable(true);
+    button->setChecked(false);
+    button->setAutoRaise(true);
+    bg->addButton(button);
+    buttonLayout->addWidget(button);
+    connect(button, SIGNAL(clicked()), this, SLOT(curveModeSelected()));
+
+    button = new QToolButton;
+    button->setIcon(il.load("spectrogram"));
+    button->setCheckable(true);
+    button->setChecked(false);
+    button->setAutoRaise(true);
+    bg->addButton(button);
+    buttonLayout->addWidget(button);
+    connect(button, SIGNAL(clicked()), this, SLOT(spectrogramModeSelected()));
+
+    button = new QToolButton;
+    button->setIcon(il.load("melodogram"));
+    button->setCheckable(true);
+    button->setChecked(false);
+    button->setAutoRaise(true);
+    bg->addButton(button);
+    buttonLayout->addWidget(button);
+    connect(button, SIGNAL(clicked()), this, SLOT(melodogramModeSelected()));
+
+    layout->addWidget(buttonFrame, 1, 0);
+
+    m_overview = new Overview(frame);
+    m_overview->setViewManager(m_viewManager);
+    m_overview->setFixedHeight(40);
+#ifndef _WIN32
+    // For some reason, the contents of the overview never appear if we
+    // make this setting on Windows.  I have no inclination at the moment
+    // to track down the reason why.
+    m_overview->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
+#endif
+    connect(m_overview, SIGNAL(contextHelpChanged(const QString &)),
+            this, SLOT(contextHelpChanged(const QString &)));
+    m_overview->hide();
+
+    m_panLayer = new WaveformLayer;
+    m_panLayer->setChannelMode(WaveformLayer::MergeChannels);
+    m_panLayer->setAggressiveCacheing(true);
+    m_overview->addLayer(m_panLayer);
+
+    if (m_viewManager->getGlobalDarkBackground()) {
+        m_panLayer->setBaseColour
+            (ColourDatabase::getInstance()->getColourIndex(tr("Bright Green")));
+    } else {
+        m_panLayer->setBaseColour
+            (ColourDatabase::getInstance()->getColourIndex(tr("Green")));
+    }        
+
+    m_fader = new Fader(frame, false);
+    connect(m_fader, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget()));
+    connect(m_fader, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget()));
+
+    m_playSpeed = new AudioDial(frame);
+    m_playSpeed->setMinimum(0);
+    m_playSpeed->setMaximum(200);
+    m_playSpeed->setValue(100);
+    m_playSpeed->setFixedWidth(24);
+    m_playSpeed->setFixedHeight(24);
+    m_playSpeed->setNotchesVisible(true);
+    m_playSpeed->setPageStep(10);
+    m_playSpeed->setObjectName(tr("Playback Speedup"));
+    m_playSpeed->setDefaultValue(100);
+    m_playSpeed->setRangeMapper(new PlaySpeedRangeMapper(0, 200));
+    m_playSpeed->setShowToolTip(true);
+    connect(m_playSpeed, SIGNAL(valueChanged(int)),
+	    this, SLOT(playSpeedChanged(int)));
+    connect(m_playSpeed, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget()));
+    connect(m_playSpeed, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget()));
+
+    layout->setSpacing(4);
+    layout->addWidget(scroll, 0, 0, 1, 6);
+    layout->addWidget(m_overview, 1, 1);
+    layout->addWidget(m_fader, 1, 2);
+    layout->addWidget(m_playSpeed, 1, 3);
+
+    m_paneStack->setPropertyStackMinWidth
+        (m_fader->width() + m_playSpeed->width() +
+         layout->spacing() * 4);
+
+    layout->setColumnStretch(1, 10);
+
+    frame->setLayout(layout);
+
+    setupMenus();
+    setupToolbars();
+    setupHelpMenu();
+
+    statusBar();
+
+    newSession();
+}
+
+MainWindow::~MainWindow()
+{
+    delete m_keyReference;
+    delete m_preferencesDialog;
+    delete m_layerTreeView;
+    Profiles::getInstance()->dump();
+}
+
+void
+MainWindow::setupMenus()
+{
+    if (!m_mainMenusCreated) {
+        m_rightButtonMenu = new QMenu();
+
+        // No -- we don't want tear-off enabled on the right-button
+        // menu.  If it is enabled, then simply right-clicking and
+        // releasing will pop up the menu, activate the tear-off, and
+        // leave the torn-off menu window in front of the main window.
+        // That isn't desirable.  I'm not sure it ever would be, in a
+        // context menu -- perhaps technically a Qt bug?
+//        m_rightButtonMenu->setTearOffEnabled(true);
+    }
+
+    if (!m_mainMenusCreated) {
+        CommandHistory::getInstance()->registerMenu(m_rightButtonMenu);
+        m_rightButtonMenu->addSeparator();
+    }
+
+    setupFileMenu();
+//    setupEditMenu();
+    setupViewMenu();
+
+    m_mainMenusCreated = true;
+}
+
+void
+MainWindow::setupFileMenu()
+{
+    if (m_mainMenusCreated) return;
+
+    QMenu *menu = menuBar()->addMenu(tr("&File"));
+    menu->setTearOffEnabled(true);
+    QToolBar *toolbar = addToolBar(tr("File Toolbar"));
+
+    m_keyReference->setCategory(tr("File and Session Management"));
+
+    IconLoader il;
+
+    QIcon icon = il.load("filenew");
+    icon.addPixmap(il.loadPixmap("filenew-22"));
+    QAction *action = new QAction(icon, tr("&Clear Session"), this);
+    action->setShortcut(tr("Ctrl+N"));
+    action->setStatusTip(tr("Abandon the current session and start a new one"));
+    connect(action, SIGNAL(triggered()), this, SLOT(newSession()));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+    toolbar->addAction(action);
+
+    icon = il.load("fileopen");
+    icon.addPixmap(il.loadPixmap("fileopen-22"));
+    action = new QAction(icon, tr("&Add File..."), this);
+    action->setShortcut(tr("Ctrl+O"));
+    action->setStatusTip(tr("Add a file"));
+    connect(action, SIGNAL(triggered()), this, SLOT(openFile()));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+    toolbar->addAction(action);
+
+    action = new QAction(tr("Add Lo&cation..."), this);
+    action->setShortcut(tr("Ctrl+Shift+O"));
+    action->setStatusTip(tr("Add a file from a remote URL"));
+    connect(action, SIGNAL(triggered()), this, SLOT(openLocation()));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+
+    menu->addSeparator();
+
+    m_recentFilesMenu = menu->addMenu(tr("&Recent Locations"));
+    m_recentFilesMenu->setTearOffEnabled(true);
+    setupRecentFilesMenu();
+    connect(&m_recentFiles, SIGNAL(recentChanged()),
+            this, SLOT(setupRecentFilesMenu()));
+/*
+    menu->addSeparator();
+    action = new QAction(tr("&Preferences..."), this);
+    action->setStatusTip(tr("Adjust the application preferences"));
+    connect(action, SIGNAL(triggered()), this, SLOT(preferences()));
+    menu->addAction(action);
+*/
+    menu->addSeparator();
+    action = new QAction(il.load("exit"), tr("&Quit"), this);
+    action->setShortcut(tr("Ctrl+Q"));
+    action->setStatusTip(tr("Exit Vect"));
+    connect(action, SIGNAL(triggered()), this, SLOT(close()));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+}
+
+void
+MainWindow::setupEditMenu()
+{
+    if (m_mainMenusCreated) return;
+
+    QMenu *menu = menuBar()->addMenu(tr("&Edit"));
+    menu->setTearOffEnabled(true);
+    CommandHistory::getInstance()->registerMenu(menu);
+}
+
+void
+MainWindow::setupViewMenu()
+{
+    if (m_mainMenusCreated) return;
+
+    IconLoader il;
+
+    QAction *action = 0;
+
+    m_keyReference->setCategory(tr("Panning and Navigation"));
+
+    QMenu *menu = menuBar()->addMenu(tr("&View"));
+    menu->setTearOffEnabled(true);
+    action = new QAction(tr("Scroll &Left"), this);
+    action->setShortcut(tr("Left"));
+    action->setStatusTip(tr("Scroll the current pane to the left"));
+    connect(action, SIGNAL(triggered()), this, SLOT(scrollLeft()));
+    connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool)));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+	
+    action = new QAction(tr("Scroll &Right"), this);
+    action->setShortcut(tr("Right"));
+    action->setStatusTip(tr("Scroll the current pane to the right"));
+    connect(action, SIGNAL(triggered()), this, SLOT(scrollRight()));
+    connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool)));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+	
+    action = new QAction(tr("&Jump Left"), this);
+    action->setShortcut(tr("Ctrl+Left"));
+    action->setStatusTip(tr("Scroll the current pane a big step to the left"));
+    connect(action, SIGNAL(triggered()), this, SLOT(jumpLeft()));
+    connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool)));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+	
+    action = new QAction(tr("J&ump Right"), this);
+    action->setShortcut(tr("Ctrl+Right"));
+    action->setStatusTip(tr("Scroll the current pane a big step to the right"));
+    connect(action, SIGNAL(triggered()), this, SLOT(jumpRight()));
+    connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool)));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+
+    menu->addSeparator();
+
+    m_keyReference->setCategory(tr("Zoom"));
+
+    action = new QAction(il.load("zoom-in"),
+                         tr("Zoom &In"), this);
+    action->setShortcut(tr("Up"));
+    action->setStatusTip(tr("Increase the zoom level"));
+    connect(action, SIGNAL(triggered()), this, SLOT(zoomIn()));
+    connect(this, SIGNAL(canZoom(bool)), action, SLOT(setEnabled(bool)));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+	
+    action = new QAction(il.load("zoom-out"),
+                         tr("Zoom &Out"), this);
+    action->setShortcut(tr("Down"));
+    action->setStatusTip(tr("Decrease the zoom level"));
+    connect(action, SIGNAL(triggered()), this, SLOT(zoomOut()));
+    connect(this, SIGNAL(canZoom(bool)), action, SLOT(setEnabled(bool)));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+	
+    action = new QAction(tr("Restore &Default Zoom"), this);
+    action->setStatusTip(tr("Restore the zoom level to the default"));
+    connect(action, SIGNAL(triggered()), this, SLOT(zoomDefault()));
+    connect(this, SIGNAL(canZoom(bool)), action, SLOT(setEnabled(bool)));
+    menu->addAction(action);
+
+    action = new QAction(il.load("zoom-fit"),
+                         tr("Zoom to &Fit"), this);
+    action->setShortcut(tr("F"));
+    action->setStatusTip(tr("Zoom to show the whole file"));
+    connect(action, SIGNAL(triggered()), this, SLOT(zoomToFit()));
+    connect(this, SIGNAL(canZoom(bool)), action, SLOT(setEnabled(bool)));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+
+    menu->addSeparator();
+
+    m_keyReference->setCategory(tr("Display Features"));
+
+    QActionGroup *overlayGroup = new QActionGroup(this);
+        
+    action = new QAction(tr("Show &No Overlays"), this);
+    action->setShortcut(tr("0"));
+    action->setStatusTip(tr("Hide centre indicator, frame times, layer names and scale"));
+    connect(action, SIGNAL(triggered()), this, SLOT(showNoOverlays()));
+    action->setCheckable(true);
+    action->setChecked(false);
+    overlayGroup->addAction(action);
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+        
+    action = new QAction(tr("Show &Minimal Overlays"), this);
+    action->setShortcut(tr("9"));
+    action->setStatusTip(tr("Show centre indicator only"));
+    connect(action, SIGNAL(triggered()), this, SLOT(showMinimalOverlays()));
+    action->setCheckable(true);
+    action->setChecked(false);
+    overlayGroup->addAction(action);
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+        
+    action = new QAction(tr("Show &Standard Overlays"), this);
+    action->setShortcut(tr("8"));
+    action->setStatusTip(tr("Show centre indicator, frame times and scale"));
+    connect(action, SIGNAL(triggered()), this, SLOT(showStandardOverlays()));
+    action->setCheckable(true);
+    action->setChecked(true);
+    overlayGroup->addAction(action);
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+        
+    action = new QAction(tr("Show &All Overlays"), this);
+    action->setShortcut(tr("7"));
+    action->setStatusTip(tr("Show all texts and scale"));
+    connect(action, SIGNAL(triggered()), this, SLOT(showAllOverlays()));
+    action->setCheckable(true);
+    action->setChecked(false);
+    overlayGroup->addAction(action);
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+        
+    menu->addSeparator();
+
+    action = new QAction(tr("Show &Zoom Wheels"), this);
+    action->setShortcut(tr("Z"));
+    action->setStatusTip(tr("Show thumbwheels for zooming horizontally and vertically"));
+    connect(action, SIGNAL(triggered()), this, SLOT(toggleZoomWheels()));
+    action->setCheckable(true);
+    action->setChecked(m_viewManager->getZoomWheelsEnabled());
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+        
+    action = new QAction(tr("Show Property Bo&xes"), this);
+    action->setShortcut(tr("X"));
+    action->setStatusTip(tr("Show the layer property boxes at the side of the main window"));
+    connect(action, SIGNAL(triggered()), this, SLOT(togglePropertyBoxes()));
+    action->setCheckable(true);
+    action->setChecked(false); //!!!
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+
+    action = new QAction(tr("Show Status &Bar"), this);
+    action->setStatusTip(tr("Show context help information in the status bar at the bottom of the window"));
+    connect(action, SIGNAL(triggered()), this, SLOT(toggleStatusBar()));
+    action->setCheckable(true);
+    action->setChecked(true);
+    menu->addAction(action);
+
+    QSettings settings;
+    settings.beginGroup("MainWindow");
+    bool sb = settings.value("showstatusbar", true).toBool();
+    if (!sb) {
+        action->setChecked(false);
+        statusBar()->hide();
+    }
+    settings.endGroup();
+
+    menu->addSeparator();
+
+    action = new QAction(tr("Show La&yer Hierarchy"), this);
+    action->setShortcut(tr("H"));
+    action->setStatusTip(tr("Open a window displaying the hierarchy of panes and layers in this session"));
+    connect(action, SIGNAL(triggered()), this, SLOT(showLayerTree()));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+}
+
+void
+MainWindow::setupHelpMenu()
+{
+    QMenu *menu = menuBar()->addMenu(tr("&Help"));
+    menu->setTearOffEnabled(true);
+    
+    m_keyReference->setCategory(tr("Help"));
+
+    IconLoader il;
+
+    QAction *action = new QAction(il.load("help"),
+                                  tr("&Help Reference"), this); 
+    action->setShortcut(tr("F1"));
+    action->setStatusTip(tr("Open the reference manual")); 
+    connect(action, SIGNAL(triggered()), this, SLOT(help()));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+
+    action = new QAction(tr("&Key and Mouse Reference"), this);
+    action->setShortcut(tr("F2"));
+    action->setStatusTip(tr("Open a window showing the keystrokes you can use"));
+    connect(action, SIGNAL(triggered()), this, SLOT(keyReference()));
+    m_keyReference->registerShortcut(action);
+    menu->addAction(action);
+    
+    action = new QAction(tr("Sonic Visualiser on the &Web"), this); 
+    action->setStatusTip(tr("Open the Sonic Visualiser website")); 
+    connect(action, SIGNAL(triggered()), this, SLOT(website()));
+    menu->addAction(action);
+    
+    action = new QAction(tr("&About Sonic Visualiser"), this); 
+    action->setStatusTip(tr("Show information about Sonic Visualiser")); 
+    connect(action, SIGNAL(triggered()), this, SLOT(about()));
+    menu->addAction(action);
+}
+
+void
+MainWindow::setupRecentFilesMenu()
+{
+    m_recentFilesMenu->clear();
+    vector<QString> files = m_recentFiles.getRecent();
+    for (size_t i = 0; i < files.size(); ++i) {
+	QAction *action = new QAction(files[i], this);
+	connect(action, SIGNAL(triggered()), this, SLOT(openRecentFile()));
+        if (i == 0) {
+            action->setShortcut(tr("Ctrl+R"));
+            m_keyReference->registerShortcut
+                (tr("Re-open"),
+                 action->shortcut(),
+                 tr("Re-open the current or most recently opened file"));
+        }
+	m_recentFilesMenu->addAction(action);
+    }
+}
+
+void
+MainWindow::setupToolbars()
+{
+    m_keyReference->setCategory(tr("Playback and Transport Controls"));
+
+    IconLoader il;
+
+    QMenu *menu = m_playbackMenu = menuBar()->addMenu(tr("Play&back"));
+    menu->setTearOffEnabled(true);
+    m_rightButtonMenu->addSeparator();
+    m_rightButtonPlaybackMenu = m_rightButtonMenu->addMenu(tr("Playback"));
+
+    QToolBar *toolbar = addToolBar(tr("Playback Toolbar"));
+
+    QAction *rwdStartAction = toolbar->addAction(il.load("rewind-start"),
+                                                 tr("Rewind to Start"));
+    rwdStartAction->setShortcut(tr("Home"));
+    rwdStartAction->setStatusTip(tr("Rewind to the start"));
+    connect(rwdStartAction, SIGNAL(triggered()), this, SLOT(rewindStart()));
+    connect(this, SIGNAL(canPlay(bool)), rwdStartAction, SLOT(setEnabled(bool)));
+
+    QAction *m_rwdAction = toolbar->addAction(il.load("rewind"),
+                                              tr("Rewind"));
+    m_rwdAction->setShortcut(tr("PgUp"));
+    m_rwdAction->setStatusTip(tr("Rewind to the previous time instant or time ruler notch"));
+    connect(m_rwdAction, SIGNAL(triggered()), this, SLOT(rewind()));
+    connect(this, SIGNAL(canRewind(bool)), m_rwdAction, SLOT(setEnabled(bool)));
+
+    QAction *playAction = toolbar->addAction(il.load("playpause"),
+                                             tr("Play / Pause"));
+    playAction->setCheckable(true);
+    playAction->setShortcut(tr("Space"));
+    playAction->setStatusTip(tr("Start or stop playback from the current position"));
+    connect(playAction, SIGNAL(triggered()), this, SLOT(play()));
+    connect(m_playSource, SIGNAL(playStatusChanged(bool)),
+	    playAction, SLOT(setChecked(bool)));
+    connect(this, SIGNAL(canPlay(bool)), playAction, SLOT(setEnabled(bool)));
+
+    m_ffwdAction = toolbar->addAction(il.load("ffwd"),
+                                              tr("Fast Forward"));
+    m_ffwdAction->setShortcut(tr("PgDown"));
+    m_ffwdAction->setStatusTip(tr("Fast-forward to the next time instant or time ruler notch"));
+    connect(m_ffwdAction, SIGNAL(triggered()), this, SLOT(ffwd()));
+    connect(this, SIGNAL(canFfwd(bool)), m_ffwdAction, SLOT(setEnabled(bool)));
+
+    QAction *ffwdEndAction = toolbar->addAction(il.load("ffwd-end"),
+                                                tr("Fast Forward to End"));
+    ffwdEndAction->setShortcut(tr("End"));
+    ffwdEndAction->setStatusTip(tr("Fast-forward to the end"));
+    connect(ffwdEndAction, SIGNAL(triggered()), this, SLOT(ffwdEnd()));
+    connect(this, SIGNAL(canPlay(bool)), ffwdEndAction, SLOT(setEnabled(bool)));
+/*
+    toolbar = addToolBar(tr("Play Mode Toolbar"));
+
+    QAction *psAction = toolbar->addAction(il.load("playselection"),
+                                           tr("Constrain Playback to Selection"));
+    psAction->setCheckable(true);
+    psAction->setChecked(m_viewManager->getPlaySelectionMode());
+    psAction->setShortcut(tr("s"));
+    psAction->setStatusTip(tr("Constrain playback to the selected regions"));
+    connect(m_viewManager, SIGNAL(playSelectionModeChanged(bool)),
+            psAction, SLOT(setChecked(bool)));
+    connect(psAction, SIGNAL(triggered()), this, SLOT(playSelectionToggled()));
+    connect(this, SIGNAL(canPlaySelection(bool)), psAction, SLOT(setEnabled(bool)));
+
+    QAction *plAction = toolbar->addAction(il.load("playloop"),
+                                           tr("Loop Playback"));
+    plAction->setCheckable(true);
+    plAction->setChecked(m_viewManager->getPlayLoopMode());
+    plAction->setShortcut(tr("l"));
+    plAction->setStatusTip(tr("Loop playback"));
+    connect(m_viewManager, SIGNAL(playLoopModeChanged(bool)),
+            plAction, SLOT(setChecked(bool)));
+    connect(plAction, SIGNAL(triggered()), this, SLOT(playLoopToggled()));
+    connect(this, SIGNAL(canPlay(bool)), plAction, SLOT(setEnabled(bool)));
+
+    QAction *soAction = toolbar->addAction(il.load("solo"),
+                                           tr("Solo Current Pane"));
+    soAction->setCheckable(true);
+    soAction->setChecked(m_viewManager->getPlaySoloMode());
+    soAction->setShortcut(tr("o"));
+    soAction->setStatusTip(tr("Solo the current pane during playback"));
+    connect(m_viewManager, SIGNAL(playSoloModeChanged(bool)),
+            soAction, SLOT(setChecked(bool)));
+    connect(soAction, SIGNAL(triggered()), this, SLOT(playSoloToggled()));
+    connect(this, SIGNAL(canPlay(bool)), soAction, SLOT(setEnabled(bool)));
+
+    m_keyReference->registerShortcut(psAction);
+    m_keyReference->registerShortcut(plAction);
+    m_keyReference->registerShortcut(soAction);
+*/
+    m_keyReference->registerShortcut(playAction);
+    m_keyReference->registerShortcut(m_rwdAction);
+    m_keyReference->registerShortcut(m_ffwdAction);
+    m_keyReference->registerShortcut(rwdStartAction);
+    m_keyReference->registerShortcut(ffwdEndAction);
+
+/*
+    menu->addAction(psAction);
+    menu->addAction(plAction);
+    menu->addAction(soAction);
+*/
+    menu->addAction(playAction);
+    menu->addSeparator();
+    menu->addAction(m_rwdAction);
+    menu->addAction(m_ffwdAction);
+    menu->addSeparator();
+    menu->addAction(rwdStartAction);
+    menu->addAction(ffwdEndAction);
+    menu->addSeparator();
+
+    m_rightButtonPlaybackMenu->addAction(playAction);
+/*
+    m_rightButtonPlaybackMenu->addAction(psAction);
+    m_rightButtonPlaybackMenu->addAction(plAction);
+    m_rightButtonPlaybackMenu->addAction(soAction);
+*/
+    m_rightButtonPlaybackMenu->addSeparator();
+    m_rightButtonPlaybackMenu->addAction(m_rwdAction);
+    m_rightButtonPlaybackMenu->addAction(m_ffwdAction);
+    m_rightButtonPlaybackMenu->addSeparator();
+    m_rightButtonPlaybackMenu->addAction(rwdStartAction);
+    m_rightButtonPlaybackMenu->addAction(ffwdEndAction);
+    m_rightButtonPlaybackMenu->addSeparator();
+
+    QAction *fastAction = menu->addAction(tr("Speed Up"));
+    fastAction->setShortcut(tr("Ctrl+PgUp"));
+    fastAction->setStatusTip(tr("Time-stretch playback to speed it up without changing pitch"));
+    connect(fastAction, SIGNAL(triggered()), this, SLOT(speedUpPlayback()));
+    connect(this, SIGNAL(canSpeedUpPlayback(bool)), fastAction, SLOT(setEnabled(bool)));
+    
+    QAction *slowAction = menu->addAction(tr("Slow Down"));
+    slowAction->setShortcut(tr("Ctrl+PgDown"));
+    slowAction->setStatusTip(tr("Time-stretch playback to slow it down without changing pitch"));
+    connect(slowAction, SIGNAL(triggered()), this, SLOT(slowDownPlayback()));
+    connect(this, SIGNAL(canSlowDownPlayback(bool)), slowAction, SLOT(setEnabled(bool)));
+
+    QAction *normalAction = menu->addAction(tr("Restore Normal Speed"));
+    normalAction->setShortcut(tr("Ctrl+Home"));
+    normalAction->setStatusTip(tr("Restore non-time-stretched playback"));
+    connect(normalAction, SIGNAL(triggered()), this, SLOT(restoreNormalPlayback()));
+    connect(this, SIGNAL(canChangePlaybackSpeed(bool)), normalAction, SLOT(setEnabled(bool)));
+
+    m_keyReference->registerShortcut(fastAction);
+    m_keyReference->registerShortcut(slowAction);
+    m_keyReference->registerShortcut(normalAction);
+
+    m_rightButtonPlaybackMenu->addAction(fastAction);
+    m_rightButtonPlaybackMenu->addAction(slowAction);
+    m_rightButtonPlaybackMenu->addAction(normalAction);
+/*
+    toolbar = addToolBar(tr("Edit Toolbar"));
+    CommandHistory::getInstance()->registerToolbar(toolbar);
+*/
+
+    Pane::registerShortcuts(*m_keyReference);
+}
+
+void
+MainWindow::updateMenuStates()
+{
+    MainWindowBase::updateMenuStates();
+
+    Pane *currentPane = 0;
+    Layer *currentLayer = 0;
+
+    if (m_paneStack) currentPane = m_paneStack->getCurrentPane();
+    if (currentPane) currentLayer = currentPane->getSelectedLayer();
+
+    bool haveCurrentPane =
+        (currentPane != 0);
+    bool haveCurrentLayer =
+        (haveCurrentPane &&
+         (currentLayer != 0));
+    bool haveSelection = 
+	(m_viewManager &&
+	 !m_viewManager->getSelections().empty());
+    bool haveCurrentEditableLayer =
+	(haveCurrentLayer &&
+	 currentLayer->isLayerEditable());
+    bool haveCurrentTimeInstantsLayer = 
+	(haveCurrentLayer &&
+	 dynamic_cast<TimeInstantLayer *>(currentLayer));
+    bool haveCurrentTimeValueLayer = 
+	(haveCurrentLayer &&
+	 dynamic_cast<TimeValueLayer *>(currentLayer));
+
+    emit canChangePlaybackSpeed(true);
+    int v = m_playSpeed->value();
+    emit canSpeedUpPlayback(v < m_playSpeed->maximum());
+    emit canSlowDownPlayback(v > m_playSpeed->minimum());
+
+    if (m_ffwdAction && m_rwdAction) {
+        if (haveCurrentTimeInstantsLayer) {
+            m_ffwdAction->setText(tr("Fast Forward to Next Instant"));
+            m_ffwdAction->setStatusTip(tr("Fast forward to the next time instant in the current layer"));
+            m_rwdAction->setText(tr("Rewind to Previous Instant"));
+            m_rwdAction->setStatusTip(tr("Rewind to the previous time instant in the current layer"));
+        } else if (haveCurrentTimeValueLayer) {
+            m_ffwdAction->setText(tr("Fast Forward to Next Point"));
+            m_ffwdAction->setStatusTip(tr("Fast forward to the next point in the current layer"));
+            m_rwdAction->setText(tr("Rewind to Previous Point"));
+            m_rwdAction->setStatusTip(tr("Rewind to the previous point in the current layer"));
+        } else {
+            m_ffwdAction->setText(tr("Fast Forward"));
+            m_ffwdAction->setStatusTip(tr("Fast forward"));
+            m_rwdAction->setText(tr("Rewind"));
+            m_rwdAction->setStatusTip(tr("Rewind"));
+        }
+    }
+}
+
+void
+MainWindow::updateDescriptionLabel()
+{
+    if (!getMainModel()) {
+	m_descriptionLabel->setText(tr("No audio file loaded."));
+	return;
+    }
+
+    QString description;
+
+    size_t ssr = getMainModel()->getSampleRate();
+    size_t tsr = ssr;
+    if (m_playSource) tsr = m_playSource->getTargetSampleRate();
+
+    if (ssr != tsr) {
+	description = tr("%1Hz (resampling to %2Hz)").arg(ssr).arg(tsr);
+    } else {
+	description = QString("%1Hz").arg(ssr);
+    }
+
+    description = QString("%1 - %2")
+	.arg(RealTime::frame2RealTime(getMainModel()->getEndFrame(), ssr)
+	     .toText(false).c_str())
+	.arg(description);
+
+    m_descriptionLabel->setText(description);
+}
+
+void
+MainWindow::documentModified()
+{
+    //!!!
+    MainWindowBase::documentModified();
+}
+
+void
+MainWindow::documentRestored()
+{
+    //!!!
+    MainWindowBase::documentRestored();
+}
+
+void
+MainWindow::newSession()
+{
+    if (!checkSaveModified()) return;
+
+    closeSession();
+    createDocument();
+    m_document->setAutoAlignment(true);
+
+    Pane *pane = m_paneStack->addPane();
+
+    connect(pane, SIGNAL(contextHelpChanged(const QString &)),
+            this, SLOT(contextHelpChanged(const QString &)));
+
+    Layer *waveform = m_document->createMainModelLayer(LayerFactory::Waveform);
+    m_document->addLayerToView(pane, waveform);
+
+    m_overview->registerView(pane);
+
+    CommandHistory::getInstance()->clear();
+    CommandHistory::getInstance()->documentSaved();
+    documentRestored();
+    updateMenuStates();
+}
+
+void
+MainWindow::closeSession()
+{
+    if (!checkSaveModified()) return;
+
+    while (m_paneStack->getPaneCount() > 0) {
+
+	Pane *pane = m_paneStack->getPane(m_paneStack->getPaneCount() - 1);
+
+	while (pane->getLayerCount() > 0) {
+	    m_document->removeLayerFromView
+		(pane, pane->getLayer(pane->getLayerCount() - 1));
+	}
+
+	m_overview->unregisterView(pane);
+	m_paneStack->deletePane(pane);
+    }
+
+    while (m_paneStack->getHiddenPaneCount() > 0) {
+
+	Pane *pane = m_paneStack->getHiddenPane
+	    (m_paneStack->getHiddenPaneCount() - 1);
+
+	while (pane->getLayerCount() > 0) {
+	    m_document->removeLayerFromView
+		(pane, pane->getLayer(pane->getLayerCount() - 1));
+	}
+
+	m_overview->unregisterView(pane);
+	m_paneStack->deletePane(pane);
+    }
+
+    delete m_document;
+    m_document = 0;
+    m_viewManager->clearSelections();
+    m_timeRulerLayer = 0; // document owned this
+
+    m_sessionFile = "";
+    setWindowTitle(tr("Vect"));
+
+    CommandHistory::getInstance()->clear();
+    CommandHistory::getInstance()->documentSaved();
+    documentRestored();
+}
+
+void
+MainWindow::openFile()
+{
+    QString orig = m_audioFile;
+    if (orig == "") orig = ".";
+    else orig = QFileInfo(orig).absoluteDir().canonicalPath();
+
+    QString path = getOpenFileName(FileFinder::AnyFile);
+
+    if (path.isEmpty()) return;
+
+    FileOpenStatus status = open(path, CreateAdditionalModel);
+
+    if (status == FileOpenFailed) {
+        QMessageBox::critical(this, tr("Failed to open file"),
+                              tr("<b>File open failed</b><p>File \"%1\" could not be opened").arg(path));
+    } else if (status == FileOpenWrongMode) {
+        QMessageBox::critical(this, tr("Failed to open file"),
+                              tr("<b>Audio required</b><p>Please load at least one audio file before importing annotation data"));
+    } else {
+        configureNewPane(m_paneStack->getCurrentPane());
+    }
+}
+
+void
+MainWindow::openLocation()
+{
+    QSettings settings;
+    settings.beginGroup("MainWindow");
+    QString lastLocation = settings.value("lastremote", "").toString();
+
+    bool ok = false;
+    QString text = QInputDialog::getText
+        (this, tr("Open Location"),
+         tr("Please enter the URL of the location to open:"),
+         QLineEdit::Normal, lastLocation, &ok);
+
+    if (!ok) return;
+
+    settings.setValue("lastremote", text);
+
+    if (text.isEmpty()) return;
+
+    FileOpenStatus status = open(text, CreateAdditionalModel);
+
+    if (status == FileOpenFailed) {
+        QMessageBox::critical(this, tr("Failed to open location"),
+                              tr("<b>Open failed</b><p>URL \"%1\" could not be opened").arg(text));
+    } else if (status == FileOpenWrongMode) {
+        QMessageBox::critical(this, tr("Failed to open location"),
+                              tr("<b>Audio required</b><p>Please load at least one audio file before importing annotation data"));
+    } else {
+        configureNewPane(m_paneStack->getCurrentPane());
+    }
+}
+
+void
+MainWindow::openRecentFile()
+{
+    QObject *obj = sender();
+    QAction *action = dynamic_cast<QAction *>(obj);
+    
+    if (!action) {
+	std::cerr << "WARNING: MainWindow::openRecentFile: sender is not an action"
+		  << std::endl;
+	return;
+    }
+
+    QString path = action->text();
+    if (path == "") return;
+
+    FileOpenStatus status = open(path, CreateAdditionalModel);
+
+    if (status == FileOpenFailed) {
+        QMessageBox::critical(this, tr("Failed to open location"),
+                              tr("<b>Open failed</b><p>File or URL \"%1\" could not be opened").arg(path));
+    } else if (status == FileOpenWrongMode) {
+        QMessageBox::critical(this, tr("Failed to open location"),
+                              tr("<b>Audio required</b><p>Please load at least one audio file before importing annotation data"));
+    } else {
+        configureNewPane(m_paneStack->getCurrentPane());
+    }
+}
+
+Model *
+MainWindow::selectExistingModeLayer(Pane *pane, QString name)
+{   
+    Model *model = 0;
+
+    bool have = false;
+
+    for (int i = 0; i < pane->getLayerCount(); ++i) {
+        
+        Layer *layer = pane->getLayer(i);
+        if (!layer) continue;
+        
+        Model *lm = layer->getModel();
+        while (lm && lm->getSourceModel()) lm = lm->getSourceModel();
+        if (dynamic_cast<WaveFileModel *>(lm)) model = lm;
+        
+        QString ln = layer->objectName();
+        if (ln != name) {
+            m_hiddenLayers[pane].insert(layer);
+            m_document->removeLayerFromView(pane, layer);
+            continue;
+        }
+        
+        have = true;
+    }
+    
+    if (have) return 0;
+
+    LayerSet &ls = m_hiddenLayers[pane];
+    bool found = false;
+    for (LayerSet::iterator i = ls.begin(); i != ls.end(); ++i) {
+        if ((*i)->objectName() == name) {
+            m_document->addLayerToView(pane, *i);
+            ls.erase(i);
+            found = true;
+            break;
+        }
+    }
+
+    if (found) return 0;
+
+    return model;
+}
+
+void
+MainWindow::curveModeSelected()
+{
+    QString name = tr("Curve");
+
+    for (int i = 0; i < m_paneStack->getPaneCount(); ++i) {
+
+        Pane *pane = m_paneStack->getPane(i);
+        if (!pane) continue;
+
+        Model *model = selectExistingModeLayer(pane, name);
+        if (!model) continue;
+
+        TransformId id = "vamp:qm-vamp-plugins:qm-onsetdetector:detection_fn";
+        TransformFactory *tf = TransformFactory::getInstance();
+
+        if (tf->haveTransform(id)) {
+
+            Transform transform = tf->getDefaultTransformFor
+                (id, model->getSampleRate());
+
+            transform.setStepSize(1024);
+            transform.setBlockSize(2048);
+
+            ModelTransformer::Input input(model, -1);
+
+//!!! no equivalent for this yet            context.updates = false;
+
+            Layer *newLayer = m_document->createDerivedLayer(transform, model);
+
+            if (newLayer) {
+                newLayer->setObjectName(name);
+                m_document->addLayerToView(pane, newLayer);
+                m_paneStack->setCurrentLayer(pane, newLayer);
+            }
+            
+        } else {
+            std::cerr << "No Aubio onset detector plugin available" << std::endl;
+        }
+    }
+
+    m_displayMode = CurveMode;
+}
+
+void
+MainWindow::waveformModeSelected()
+{
+    QString name = tr("Waveform");
+
+    for (int i = 0; i < m_paneStack->getPaneCount(); ++i) {
+
+        Pane *pane = m_paneStack->getPane(i);
+        if (!pane) continue;
+
+        Model *model = selectExistingModeLayer(pane, name);
+        if (!model) continue;
+
+        Layer *newLayer = m_document->createLayer(LayerFactory::Waveform);
+        newLayer->setObjectName(name);
+        m_document->setModel(newLayer, model);
+        m_document->addLayerToView(pane, newLayer);
+        m_paneStack->setCurrentLayer(pane, newLayer);
+    }
+
+    m_displayMode = WaveformMode;
+}
+
+void
+MainWindow::spectrogramModeSelected()
+{
+    QString name = tr("Spectrogram");
+
+    for (int i = 0; i < m_paneStack->getPaneCount(); ++i) {
+
+        Pane *pane = m_paneStack->getPane(i);
+        if (!pane) continue;
+
+        Model *model = selectExistingModeLayer(pane, name);
+        if (!model) continue;
+
+        Layer *newLayer = m_document->createLayer(LayerFactory::Spectrogram);
+        newLayer->setObjectName(name);
+        m_document->setModel(newLayer, model);
+        m_document->addLayerToView(pane, newLayer);
+        m_paneStack->setCurrentLayer(pane, newLayer);
+    }
+
+    m_displayMode = SpectrogramMode;
+}
+
+void
+MainWindow::melodogramModeSelected()
+{
+    QString name = tr("Melodic Range Spectrogram");
+
+    for (int i = 0; i < m_paneStack->getPaneCount(); ++i) {
+
+        Pane *pane = m_paneStack->getPane(i);
+        if (!pane) continue;
+
+        Model *model = selectExistingModeLayer(pane, name);
+        if (!model) continue;
+
+        Layer *newLayer = m_document->createLayer
+            (LayerFactory::MelodicRangeSpectrogram);
+        newLayer->setObjectName(name);
+        m_document->setModel(newLayer, model);
+        m_document->addLayerToView(pane, newLayer);
+        m_paneStack->setCurrentLayer(pane, newLayer);
+    }
+
+    m_displayMode = MelodogramMode;
+}
+
+void
+MainWindow::reselectMode()
+{
+    switch (m_displayMode) {
+    case CurveMode: curveModeSelected(); break;
+    case WaveformMode: waveformModeSelected(); break;
+    case SpectrogramMode: spectrogramModeSelected(); break;
+    case MelodogramMode: melodogramModeSelected(); break;
+    }
+}
+
+void
+MainWindow::paneAdded(Pane *pane)
+{
+    pane->setPlaybackFollow(PlaybackScrollContinuous);
+    m_paneStack->sizePanesEqually();
+    if (m_overview) m_overview->registerView(pane);
+}    
+
+void
+MainWindow::paneHidden(Pane *pane)
+{
+    if (m_overview) m_overview->unregisterView(pane); 
+}    
+
+void
+MainWindow::paneAboutToBeDeleted(Pane *pane)
+{
+    if (m_overview) m_overview->unregisterView(pane); 
+}    
+
+void
+MainWindow::paneDropAccepted(Pane *pane, QStringList uriList)
+{
+//    if (pane) m_paneStack->setCurrentPane(pane);
+
+    for (QStringList::iterator i = uriList.begin(); i != uriList.end(); ++i) {
+
+        FileOpenStatus status = open(*i, CreateAdditionalModel);
+
+        if (status == FileOpenFailed) {
+            QMessageBox::critical(this, tr("Failed to open dropped URL"),
+                                  tr("<b>Open failed</b><p>Dropped URL \"%1\" could not be opened").arg(*i));
+        } else if (status == FileOpenWrongMode) {
+            QMessageBox::critical(this, tr("Failed to open dropped URL"),
+                                  tr("<b>Audio required</b><p>Please load at least one audio file before importing annotation data"));
+        } else {
+            configureNewPane(m_paneStack->getCurrentPane());
+        }
+    }
+}
+
+void
+MainWindow::paneDropAccepted(Pane *pane, QString text)
+{
+    if (pane) m_paneStack->setCurrentPane(pane);
+
+    QUrl testUrl(text);
+    if (testUrl.scheme() == "file" || 
+        testUrl.scheme() == "http" || 
+        testUrl.scheme() == "ftp") {
+        QStringList list;
+        list.push_back(text);
+        paneDropAccepted(pane, list);
+        return;
+    }
+
+    //!!! open as text -- but by importing as if a CSV, or just adding
+    //to a text layer?
+}
+
+void
+MainWindow::configureNewPane(Pane *pane)
+{
+    std::cerr << "MainWindow::configureNewPane(" << pane << ")" << std::endl;
+
+    if (!pane) return;
+
+    Layer *waveformLayer = 0;
+
+    for (int i = 0; i < pane->getLayerCount(); ++i) {
+        Layer *layer = pane->getLayer(i);
+        if (!layer) continue;
+        if (dynamic_cast<WaveformLayer *>(layer)) waveformLayer = layer;
+        if (dynamic_cast<TimeValueLayer *>(layer)) return;
+    }
+    if (!waveformLayer) return;
+
+    waveformLayer->setObjectName(tr("Waveform"));
+
+    zoomToFit();
+    reselectMode();
+}
+
+void
+MainWindow::closeEvent(QCloseEvent *e)
+{
+//    std::cerr << "MainWindow::closeEvent" << std::endl;
+
+    if (m_openingAudioFile) {
+//        std::cerr << "Busy - ignoring close event" << std::endl;
+	e->ignore();
+	return;
+    }
+
+    if (!m_abandoning && !checkSaveModified()) {
+//        std::cerr << "Ignoring close event" << std::endl;
+	e->ignore();
+	return;
+    }
+
+    QSettings settings;
+    settings.beginGroup("MainWindow");
+    settings.setValue("size", size());
+    settings.setValue("position", pos());
+    settings.endGroup();
+
+    delete m_keyReference;
+    m_keyReference = 0;
+
+    if (m_preferencesDialog &&
+        m_preferencesDialog->isVisible()) {
+        closeSession(); // otherwise we'll have to wait for prefs changes
+        m_preferencesDialog->applicationClosing(false);
+    }
+
+    if (m_layerTreeView &&
+        m_layerTreeView->isVisible()) {
+        delete m_layerTreeView;
+    }
+
+    closeSession();
+
+    e->accept();
+    return;
+}
+
+bool
+MainWindow::commitData(bool mayAskUser)
+{
+    if (mayAskUser) {
+        bool rv = checkSaveModified();
+        if (rv) {
+            if (m_preferencesDialog &&
+                m_preferencesDialog->isVisible()) {
+                m_preferencesDialog->applicationClosing(false);
+            }
+        }
+        return rv;
+    } else {
+        if (m_preferencesDialog &&
+            m_preferencesDialog->isVisible()) {
+            m_preferencesDialog->applicationClosing(true);
+        }
+        if (!m_documentModified) return true;
+
+        // If we can't check with the user first, then we can't save
+        // to the original session file (even if we have it) -- have
+        // to use a temporary file
+
+        QString svDirBase = ".sv1";
+        QString svDir = QDir::home().filePath(svDirBase);
+
+        if (!QFileInfo(svDir).exists()) {
+            if (!QDir::home().mkdir(svDirBase)) return false;
+        } else {
+            if (!QFileInfo(svDir).isDir()) return false;
+        }
+        
+        // This name doesn't have to be unguessable
+#ifndef _WIN32
+        QString fname = QString("tmp-%1-%2.sv")
+            .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz"))
+            .arg(QProcess().pid());
+#else
+        QString fname = QString("tmp-%1.sv")
+            .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz"));
+#endif
+        QString fpath = QDir(svDir).filePath(fname);
+        if (saveSessionFile(fpath)) {
+            m_recentFiles.addFile(fpath);
+            return true;
+        } else {
+            return false;
+        }
+    }
+}
+
+bool
+MainWindow::checkSaveModified()
+{
+    // Called before some destructive operation (e.g. new session,
+    // exit program).  Return true if we can safely proceed, false to
+    // cancel.
+
+    if (!m_documentModified) return true;
+
+    int button = 
+	QMessageBox::warning(this,
+			     tr("Session modified"),
+			     tr("The current session has been modified.\nDo you want to save it?"),
+			     QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel,
+                             QMessageBox::Yes);
+
+    if (button == QMessageBox::Yes) {
+	saveSession();
+	if (m_documentModified) { // save failed -- don't proceed!
+	    return false;
+	} else {
+            return true; // saved, so it's safe to continue now
+        }
+    } else if (button == QMessageBox::No) {
+	m_documentModified = false; // so we know to abandon it
+	return true;
+    }
+
+    // else cancel
+    return false;
+}
+
+void
+MainWindow::saveSession()
+{
+    if (m_sessionFile != "") {
+	if (!saveSessionFile(m_sessionFile)) {
+	    QMessageBox::critical(this, tr("Failed to save file"),
+				  tr("Session file \"%1\" could not be saved.").arg(m_sessionFile));
+	} else {
+	    CommandHistory::getInstance()->documentSaved();
+	    documentRestored();
+	}
+    } else {
+	saveSessionAs();
+    }
+}
+
+void
+MainWindow::saveSessionAs()
+{
+    QString orig = m_audioFile;
+    if (orig == "") orig = ".";
+    else orig = QFileInfo(orig).absoluteDir().canonicalPath();
+
+    QString path = getSaveFileName(FileFinder::SessionFile);
+
+    if (path == "") return;
+
+    if (!saveSessionFile(path)) {
+	QMessageBox::critical(this, tr("Failed to save file"),
+			      tr("Session file \"%1\" could not be saved.").arg(path));
+    } else {
+	setWindowTitle(tr("Vect: %1")
+		       .arg(QFileInfo(path).fileName()));
+	m_sessionFile = path;
+	CommandHistory::getInstance()->documentSaved();
+	documentRestored();
+        m_recentFiles.addFile(path);
+    }
+}
+
+void
+MainWindow::preferenceChanged(PropertyContainer::PropertyName name)
+{
+    MainWindowBase::preferenceChanged(name);
+
+    if (name == "Background Mode" && m_viewManager) {
+        if (m_viewManager->getGlobalDarkBackground()) {
+            m_panLayer->setBaseColour
+                (ColourDatabase::getInstance()->getColourIndex(tr("Bright Green")));
+        } else {
+            m_panLayer->setBaseColour
+                (ColourDatabase::getInstance()->getColourIndex(tr("Green")));
+        }      
+    }    
+}
+
+void
+MainWindow::renameCurrentLayer()
+{
+    Pane *pane = m_paneStack->getCurrentPane();
+    if (pane) {
+	Layer *layer = pane->getSelectedLayer();
+	if (layer) {
+	    bool ok = false;
+	    QString newName = QInputDialog::getText
+		(this, tr("Rename Layer"),
+		 tr("New name for this layer:"),
+		 QLineEdit::Normal, layer->objectName(), &ok);
+	    if (ok) {
+		layer->setObjectName(newName);
+	    }
+	}
+    }
+}
+
+void
+MainWindow::playSpeedChanged(int position)
+{
+    PlaySpeedRangeMapper mapper(0, 200);
+
+    float percent = m_playSpeed->mappedValue();
+    float factor = mapper.getFactorForValue(percent);
+
+    std::cerr << "speed = " << position << " percent = " << percent << " factor = " << factor << std::endl;
+
+    bool something = (position != 100);
+
+    int pc = lrintf(percent);
+
+    if (!something) {
+        contextHelpChanged(tr("Playback speed: Normal"));
+    } else {
+        contextHelpChanged(tr("Playback speed: %1%2%")
+                           .arg(position > 100 ? "+" : "")
+                           .arg(pc));
+    }
+
+    m_playSource->setTimeStretch(factor);
+
+    updateMenuStates();
+}
+
+void
+MainWindow::playSharpenToggled()
+{
+    QSettings settings;
+    settings.beginGroup("MainWindow");
+    settings.setValue("playsharpen", m_playSharpen->isChecked());
+    settings.endGroup();
+
+    playSpeedChanged(m_playSpeed->value());
+}
+
+void
+MainWindow::playMonoToggled()
+{
+    QSettings settings;
+    settings.beginGroup("MainWindow");
+    settings.setValue("playmono", m_playMono->isChecked());
+    settings.endGroup();
+
+    playSpeedChanged(m_playSpeed->value());
+}    
+
+void
+MainWindow::speedUpPlayback()
+{
+    int value = m_playSpeed->value();
+    value = value + m_playSpeed->pageStep();
+    if (value > m_playSpeed->maximum()) value = m_playSpeed->maximum();
+    m_playSpeed->setValue(value);
+}
+
+void
+MainWindow::slowDownPlayback()
+{
+    int value = m_playSpeed->value();
+    value = value - m_playSpeed->pageStep();
+    if (value < m_playSpeed->minimum()) value = m_playSpeed->minimum();
+    m_playSpeed->setValue(value);
+}
+
+void
+MainWindow::restoreNormalPlayback()
+{
+    m_playSpeed->setValue(m_playSpeed->defaultValue());
+}
+
+void
+MainWindow::updateVisibleRangeDisplay(Pane *p) const
+{
+    if (!getMainModel() || !p) {
+        return;
+    }
+
+    bool haveSelection = false;
+    size_t startFrame = 0, endFrame = 0;
+
+    if (m_viewManager && m_viewManager->haveInProgressSelection()) {
+
+        bool exclusive = false;
+        Selection s = m_viewManager->getInProgressSelection(exclusive);
+
+        if (!s.isEmpty()) {
+            haveSelection = true;
+            startFrame = s.getStartFrame();
+            endFrame = s.getEndFrame();
+        }
+    }
+
+    if (!haveSelection) {
+        startFrame = p->getFirstVisibleFrame();
+        endFrame = p->getLastVisibleFrame();
+    }
+
+    RealTime start = RealTime::frame2RealTime
+        (startFrame, getMainModel()->getSampleRate());
+
+    RealTime end = RealTime::frame2RealTime
+        (endFrame, getMainModel()->getSampleRate());
+
+    RealTime duration = end - start;
+
+    QString startStr, endStr, durationStr;
+    startStr = start.toText(true).c_str();
+    endStr = end.toText(true).c_str();
+    durationStr = duration.toText(true).c_str();
+
+    if (haveSelection) {
+        m_myStatusMessage = tr("Selection: %1 to %2 (duration %3)")
+            .arg(startStr).arg(endStr).arg(durationStr);
+    } else {
+        m_myStatusMessage = tr("Visible: %1 to %2 (duration %3)")
+            .arg(startStr).arg(endStr).arg(durationStr);
+    }
+
+    statusBar()->showMessage(m_myStatusMessage);
+}
+
+void
+MainWindow::outputLevelsChanged(float left, float right)
+{
+    m_fader->setPeakLeft(left);
+    m_fader->setPeakRight(right);
+}
+
+void
+MainWindow::sampleRateMismatch(size_t requested, size_t actual,
+                               bool willResample)
+{
+    if (!willResample) {
+        //!!! more helpful message needed
+        QMessageBox::information
+            (this, tr("Sample rate mismatch"),
+             tr("The sample rate of this audio file (%1 Hz) does not match\nthe current playback rate (%2 Hz).\n\nThe file will play at the wrong speed and pitch.")
+             .arg(requested).arg(actual));
+    }        
+
+    updateDescriptionLabel();
+}
+
+void
+MainWindow::audioOverloadPluginDisabled()
+{
+    QMessageBox::information
+        (this, tr("Audio processing overload"),
+         tr("<b>Overloaded</b><p>Audio effects plugin auditioning has been disabled due to a processing overload."));
+}
+
+void
+MainWindow::audioTimeStretchMultiChannelDisabled()
+{
+    static bool shownOnce = false;
+    if (shownOnce) return;
+    QMessageBox::information
+        (this, tr("Audio processing overload"),
+         tr("<b>Overloaded</b><p>Audio playback speed processing has been reduced to a single channel, due to a processing overload."));
+    shownOnce = true;
+}
+
+void
+MainWindow::layerRemoved(Layer *layer)
+{
+    MainWindowBase::layerRemoved(layer);
+}
+
+void
+MainWindow::layerInAView(Layer *layer, bool inAView)
+{
+    MainWindowBase::layerInAView(layer, inAView);
+}
+
+void
+MainWindow::modelAdded(Model *model)
+{
+    MainWindowBase::modelAdded(model);
+    DenseTimeValueModel *dtvm = dynamic_cast<DenseTimeValueModel *>(model);
+    if (dtvm) {
+        if (!model->isReady()) {
+            connect(dtvm, SIGNAL(ready()), this, SLOT(modelReady()));
+        } else {
+            StorageAdviser::Criteria criteria = StorageAdviser::NoCriteria;
+            if (dtvm == getMainModel()) {
+                criteria = StorageAdviser::SpeedCritical;
+            }
+
+            FFTModel *fftmodel = new FFTModel
+                (dtvm,
+                 -1,
+                 HanningWindow,
+                 2048, 1024, 2048,
+                 false,
+                 criteria);
+
+            m_fftModelMap[dtvm] = fftmodel;
+            fftmodel->resume();
+        }
+    }
+}
+
+void
+MainWindow::modelReady()
+{
+    QObject *s = sender();
+    std::cerr << "MainWindow::modelReady(" << s << ")" << std::endl;
+    if (s) {
+        DenseTimeValueModel *dtvm = dynamic_cast<DenseTimeValueModel *>(s);
+        if (dtvm) {
+            StorageAdviser::Criteria criteria = StorageAdviser::NoCriteria;
+            if (dtvm == getMainModel()) {
+                criteria = StorageAdviser::SpeedCritical;
+            }
+
+            FFTModel *fftmodel = new FFTModel
+                (dtvm,
+                 -1,
+                 HanningWindow,
+                 2048, 1024, 2048,
+                 false,
+                 criteria);
+
+            m_fftModelMap[dtvm] = fftmodel;
+            fftmodel->resume();
+        } else {
+            std::cerr << "Not a DenseTimeValueModel!" << std::endl;
+        }
+    }
+}            
+
+void
+MainWindow::modelAboutToBeDeleted(Model *model)
+{
+    if (m_fftModelMap.find(model) != m_fftModelMap.end()) {
+        delete m_fftModelMap[model];
+        m_fftModelMap.erase(model);
+    }
+    MainWindowBase::modelAboutToBeDeleted(model);
+}
+
+void
+MainWindow::mainModelChanged(WaveFileModel *model)
+{
+    m_panLayer->setModel(model);
+
+    MainWindowBase::mainModelChanged(model);
+
+    if (m_playTarget) {
+        connect(m_fader, SIGNAL(valueChanged(float)),
+                m_playTarget, SLOT(setOutputGain(float)));
+    }
+}
+
+void
+MainWindow::modelGenerationFailed(QString transformName, QString message)
+{
+    if (message != "") {
+
+        QMessageBox::warning
+            (this,
+             tr("Failed to generate layer"),
+             tr("<b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform \"%1\" failed:<p>%2")
+             .arg(transformName).arg(message),
+             QMessageBox::Ok);
+    } else {
+        QMessageBox::warning
+            (this,
+             tr("Failed to generate layer"),
+             tr("<b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform \"%1\" failed.<p>No error information is available.")
+             .arg(transformName),
+             QMessageBox::Ok);
+    }
+}
+
+void
+MainWindow::modelGenerationWarning(QString transformName, QString message)
+{
+    QMessageBox::warning
+        (this, tr("Warning"), message, QMessageBox::Ok);
+}
+
+void
+MainWindow::modelRegenerationFailed(QString layerName,
+                                    QString transformName, QString message)
+{
+    if (message != "") {
+
+        QMessageBox::warning
+            (this,
+             tr("Failed to regenerate layer"),
+             tr("<b>Layer generation failed</b><p>Failed to regenerate derived layer \"%1\" using new data model as input.<p>The layer transform \"%2\" failed:<p>%3")
+             .arg(layerName).arg(transformName).arg(message),
+             QMessageBox::Ok);
+    } else {
+        QMessageBox::warning
+            (this,
+             tr("Failed to regenerate layer"),
+             tr("<b>Layer generation failed</b><p>Failed to regenerate derived layer \"%1\" using new data model as input.<p>The layer transform \"%2\" failed.<p>No error information is available.")
+             .arg(layerName).arg(transformName),
+             QMessageBox::Ok);
+    }
+}
+
+void
+MainWindow::modelRegenerationWarning(QString layerName,
+                                     QString transformName, QString message)
+{
+    QMessageBox::warning
+        (this, tr("Warning"), tr("<b>Warning when regenerating layer</b><p>When regenerating the derived layer \"%1\" using new data model as input:<p>%2").arg(layerName).arg(message), QMessageBox::Ok);
+}
+
+void
+MainWindow::alignmentFailed(QString transformName, QString message)
+{
+    QMessageBox::warning
+        (this,
+         tr("Failed to calculate alignment"),
+         tr("<b>Alignment calculation failed</b><p>Failed to calculate an audio alignment using transform \"%1\":<p>%2")
+         .arg(transformName).arg(message),
+         QMessageBox::Ok);
+}
+
+void
+MainWindow::rightButtonMenuRequested(Pane *pane, QPoint position)
+{
+//    std::cerr << "MainWindow::rightButtonMenuRequested(" << pane << ", " << position.x() << ", " << position.y() << ")" << std::endl;
+    m_paneStack->setCurrentPane(pane);
+    m_rightButtonMenu->popup(position);
+}
+
+void
+MainWindow::showLayerTree()
+{
+    if (!m_layerTreeView.isNull()) {
+        m_layerTreeView->show();
+        m_layerTreeView->raise();
+        return;
+    }
+
+    //!!! should use an actual dialog class
+        
+    m_layerTreeView = new QTreeView();
+    LayerTreeModel *tree = new LayerTreeModel(m_paneStack);
+    m_layerTreeView->resize(500, 300); //!!!
+    m_layerTreeView->setModel(tree);
+    m_layerTreeView->expandAll();
+    m_layerTreeView->show();
+}
+
+void
+MainWindow::handleOSCMessage(const OSCMessage &message)
+{
+    std::cerr << "MainWindow::handleOSCMessage: Not implemented" << std::endl;
+}
+
+void
+MainWindow::preferences()
+{
+    if (!m_preferencesDialog.isNull()) {
+        m_preferencesDialog->show();
+        m_preferencesDialog->raise();
+        return;
+    }
+
+    m_preferencesDialog = new PreferencesDialog(this);
+
+    // DeleteOnClose is safe here, because m_preferencesDialog is a
+    // QPointer that will be zeroed when the dialog is deleted.  We
+    // use it in preference to leaving the dialog lying around because
+    // if you Cancel the dialog, it resets the preferences state
+    // without resetting its own widgets, so its state will be
+    // incorrect when next shown unless we construct it afresh
+    m_preferencesDialog->setAttribute(Qt::WA_DeleteOnClose);
+
+    m_preferencesDialog->show();
+}
+
+void
+MainWindow::mouseEnteredWidget()
+{
+    QWidget *w = dynamic_cast<QWidget *>(sender());
+    if (!w) return;
+
+    if (w == m_fader) {
+        contextHelpChanged(tr("Adjust the master playback level"));
+    } else if (w == m_playSpeed) {
+        contextHelpChanged(tr("Adjust the master playback speed"));
+    } else if (w == m_playSharpen && w->isEnabled()) {
+        contextHelpChanged(tr("Toggle transient sharpening for playback time scaling"));
+    } else if (w == m_playMono && w->isEnabled()) {
+        contextHelpChanged(tr("Toggle mono mode for playback time scaling"));
+    }
+}
+
+void
+MainWindow::mouseLeftWidget()
+{
+    contextHelpChanged("");
+}
+
+void
+MainWindow::website()
+{
+    openHelpUrl(tr("http://www.sonicvisualiser.org/"));
+}
+
+void
+MainWindow::help()
+{
+    openHelpUrl(tr("http://www.sonicvisualiser.org/doc/reference/1.0/en/"));
+}
+
+void
+MainWindow::about()
+{
+    bool debug = false;
+    QString version = "(unknown version)";
+
+#ifdef BUILD_DEBUG
+    debug = true;
+#endif
+#ifdef VECT_VERSION
+#ifdef SVNREV
+    version = tr("Release %1 : Revision %2").arg(VECT_VERSION).arg(SVNREV);
+#else
+    version = tr("Release %1").arg(VECT_VERSION);
+#endif
+#else
+#ifdef SVNREV
+    version = tr("Unreleased : Revision %1").arg(SVNREV);
+#endif
+#endif
+
+    QString aboutText;
+
+    aboutText += tr("<h3>About Sonic Visualiser</h3>");
+    aboutText += tr("<p>Sonic Visualiser is a program for viewing and exploring audio data for<br>semantic music analysis and annotation.</p>");
+    aboutText += tr("<p>%1 : %2 configuration</p>")
+        .arg(version)
+        .arg(debug ? tr("Debug") : tr("Release"));
+
+#ifndef BUILD_STATIC
+    aboutText += tr("<br>Using Qt v%1 &copy; Trolltech AS").arg(QT_VERSION_STR);
+#else
+#ifdef QT_SHARED
+    aboutText += tr("<br>Using Qt v%1 &copy; Trolltech AS").arg(QT_VERSION_STR);
+#endif
+#endif
+
+#ifdef BUILD_STATIC
+    aboutText += tr("<p>Statically linked");
+#ifndef QT_SHARED
+    aboutText += tr("<br>With Qt (v%1) &copy; Trolltech AS").arg(QT_VERSION_STR);
+#endif
+#ifdef HAVE_JACK
+#ifdef JACK_VERSION
+    aboutText += tr("<br>With JACK audio output (v%1) &copy; Paul Davis and Jack O'Quin").arg(JACK_VERSION);
+#else
+    aboutText += tr("<br>With JACK audio output &copy; Paul Davis and Jack O'Quin");
+#endif
+#endif
+#ifdef HAVE_PORTAUDIO
+    aboutText += tr("<br>With PortAudio audio output &copy; Ross Bencina and Phil Burk");
+#endif
+#ifdef HAVE_OGGZ
+#ifdef OGGZ_VERSION
+    aboutText += tr("<br>With Ogg file decoder (oggz v%1, fishsound v%2) &copy; CSIRO Australia").arg(OGGZ_VERSION).arg(FISHSOUND_VERSION);
+#else
+    aboutText += tr("<br>With Ogg file decoder &copy; CSIRO Australia");
+#endif
+#endif
+#ifdef HAVE_MAD
+#ifdef MAD_VERSION
+    aboutText += tr("<br>With MAD mp3 decoder (v%1) &copy; Underbit Technologies Inc").arg(MAD_VERSION);
+#else
+    aboutText += tr("<br>With MAD mp3 decoder &copy; Underbit Technologies Inc");
+#endif
+#endif
+#ifdef HAVE_SAMPLERATE
+#ifdef SAMPLERATE_VERSION
+    aboutText += tr("<br>With libsamplerate (v%1) &copy; Erik de Castro Lopo").arg(SAMPLERATE_VERSION);
+#else
+    aboutText += tr("<br>With libsamplerate &copy; Erik de Castro Lopo");
+#endif
+#endif
+#ifdef HAVE_SNDFILE
+#ifdef SNDFILE_VERSION
+    aboutText += tr("<br>With libsndfile (v%1) &copy; Erik de Castro Lopo").arg(SNDFILE_VERSION);
+#else
+    aboutText += tr("<br>With libsndfile &copy; Erik de Castro Lopo");
+#endif
+#endif
+#ifdef HAVE_FFTW3F
+#ifdef FFTW3_VERSION
+    aboutText += tr("<br>With FFTW3 (v%1) &copy; Matteo Frigo and MIT").arg(FFTW3_VERSION);
+#else
+    aboutText += tr("<br>With FFTW3 &copy; Matteo Frigo and MIT");
+#endif
+#endif
+#ifdef HAVE_VAMP
+    aboutText += tr("<br>With Vamp plugin support (API v%1, host SDK v%2) &copy; Chris Cannam").arg(VAMP_API_VERSION).arg(VAMP_SDK_VERSION);
+#endif
+    aboutText += tr("<br>With LADSPA plugin support (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld").arg(LADSPA_VERSION);
+    aboutText += tr("<br>With DSSI plugin support (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton").arg(DSSI_VERSION);
+#ifdef HAVE_LIBLO
+#ifdef LIBLO_VERSION
+    aboutText += tr("<br>With liblo Lite OSC library (v%1) &copy; Steve Harris").arg(LIBLO_VERSION);
+#else
+    aboutText += tr("<br>With liblo Lite OSC library &copy; Steve Harris").arg(LIBLO_VERSION);
+#endif
+    if (m_oscQueue && m_oscQueue->isOK()) {
+        aboutText += tr("<p>The OSC URL for this instance is: \"%1\"").arg(m_oscQueue->getOSCURL());
+    }
+#endif
+    aboutText += "</p>";
+#endif
+
+    aboutText += 
+        "<p>Sonic Visualiser Copyright &copy; 2005 - 2007 Chris Cannam and<br>"
+        "Queen Mary, University of London.</p>"
+        "<p>This program is free software; you can redistribute it and/or<br>"
+        "modify it under the terms of the GNU General Public License as<br>"
+        "published by the Free Software Foundation; either version 2 of the<br>"
+        "License, or (at your option) any later version.<br>See the file "
+        "COPYING included with this distribution for more information.</p>";
+    
+    QMessageBox::about(this, tr("About Sonic Visualiser"), aboutText);
+}
+
+void
+MainWindow::keyReference()
+{
+    m_keyReference->show();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/MainWindow.h	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,202 @@
+/* -*- 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.
+*/
+
+#ifndef _MAIN_WINDOW_H_
+#define _MAIN_WINDOW_H_
+
+#include <QFrame>
+#include <QString>
+#include <QUrl>
+#include <QMainWindow>
+#include <QPointer>
+
+#include "framework/MainWindowBase.h"
+#include "base/Command.h"
+#include "view/ViewManager.h"
+#include "base/PropertyContainer.h"
+#include "base/RecentFiles.h"
+#include "layer/LayerFactory.h"
+#include "transform/Transform.h"
+#include "framework/SVFileReader.h"
+#include "widgets/FileFinder.h"
+#include <map>
+
+class Document;
+class PaneStack;
+class Pane;
+class View;
+class Fader;
+class Overview;
+class Layer;
+class WaveformLayer;
+class WaveFileModel;
+class AudioCallbackPlaySource;
+class AudioCallbackPlayTarget;
+class CommandHistory;
+class QMenu;
+class AudioDial;
+class QLabel;
+class QCheckBox;
+class PreferencesDialog;
+class QTreeView;
+class QPushButton;
+class OSCQueue;
+class OSCMessage;
+class KeyReference;
+
+
+class MainWindow : public MainWindowBase
+{
+    Q_OBJECT
+
+public:
+    MainWindow(bool withAudioOutput = true,
+               bool withOSCSupport = true);
+    virtual ~MainWindow();
+
+public slots:
+    virtual void preferenceChanged(PropertyContainer::PropertyName);
+    virtual bool commitData(bool mayAskUser); // on session shutdown
+
+protected slots:
+    virtual void openFile();
+    virtual void openLocation();
+    virtual void openRecentFile();
+    virtual void saveSession();
+    virtual void saveSessionAs();
+    virtual void newSession();
+    virtual void closeSession();
+    virtual void preferences();
+
+    virtual void curveModeSelected();
+    virtual void waveformModeSelected();
+    virtual void spectrogramModeSelected();
+    virtual void melodogramModeSelected();
+
+    virtual void renameCurrentLayer();
+
+    virtual void paneAdded(Pane *);
+    virtual void paneHidden(Pane *);
+    virtual void paneAboutToBeDeleted(Pane *);
+    virtual void paneDropAccepted(Pane *, QStringList);
+    virtual void paneDropAccepted(Pane *, QString);
+
+    virtual void playSpeedChanged(int);
+    virtual void playSharpenToggled();
+    virtual void playMonoToggled();
+
+    virtual void speedUpPlayback();
+    virtual void slowDownPlayback();
+    virtual void restoreNormalPlayback();
+
+    virtual void sampleRateMismatch(size_t, size_t, bool);
+    virtual void audioOverloadPluginDisabled();
+    virtual void audioTimeStretchMultiChannelDisabled();
+
+    virtual void outputLevelsChanged(float, float);
+
+    virtual void documentModified();
+    virtual void documentRestored();
+
+    virtual void updateMenuStates();
+    virtual void updateDescriptionLabel();
+
+    virtual void layerRemoved(Layer *);
+    virtual void layerInAView(Layer *, bool);
+
+    virtual void mainModelChanged(WaveFileModel *);
+    virtual void modelAdded(Model *);
+    virtual void modelReady();
+    virtual void modelAboutToBeDeleted(Model *);
+
+    virtual void modelGenerationFailed(QString, QString);
+    virtual void modelGenerationWarning(QString, QString);
+    virtual void modelRegenerationFailed(QString, QString, QString);
+    virtual void modelRegenerationWarning(QString, QString, QString);
+    virtual void alignmentFailed(QString, QString);
+
+    virtual void rightButtonMenuRequested(Pane *, QPoint point);
+
+    virtual void setupRecentFilesMenu();
+
+    virtual void showLayerTree();
+
+    virtual void handleOSCMessage(const OSCMessage &);
+
+    virtual void mouseEnteredWidget();
+    virtual void mouseLeftWidget();
+
+    virtual void website();
+    virtual void help();
+    virtual void about();
+    virtual void keyReference();
+
+protected:
+    Overview                *m_overview;
+    Fader                   *m_fader;
+    AudioDial               *m_playSpeed;
+    QPushButton             *m_playSharpen;
+    QPushButton             *m_playMono;
+    WaveformLayer           *m_panLayer;
+
+    bool                     m_mainMenusCreated;
+    QMenu                   *m_playbackMenu;
+    QMenu                   *m_recentFilesMenu;
+    QMenu                   *m_rightButtonMenu;
+    QMenu                   *m_rightButtonPlaybackMenu;
+
+    QAction                 *m_deleteSelectedAction;
+    QAction                 *m_ffwdAction;
+    QAction                 *m_rwdAction;
+
+    QPointer<PreferencesDialog> m_preferencesDialog;
+    QPointer<QTreeView>      m_layerTreeView;
+
+    KeyReference            *m_keyReference;
+
+    typedef std::set<Layer *> LayerSet;
+    typedef std::map<Pane *, LayerSet> PaneLayerMap;
+    PaneLayerMap             m_hiddenLayers;
+
+    virtual void setupMenus();
+    virtual void setupFileMenu();
+    virtual void setupEditMenu();
+    virtual void setupViewMenu();
+    virtual void setupHelpMenu();
+    virtual void setupToolbars();
+
+    enum DisplayMode {
+        CurveMode,
+        WaveformMode,
+        SpectrogramMode,
+        MelodogramMode
+    };
+    virtual void reselectMode();
+    DisplayMode m_displayMode;
+
+    typedef std::map<Model *, Model *> ModelPairMap;
+    ModelPairMap m_fftModelMap;
+
+    virtual void closeEvent(QCloseEvent *e);
+    bool checkSaveModified();
+
+    virtual void configureNewPane(Pane *p);
+    virtual Model *selectExistingModeLayer(Pane *, QString);
+
+    virtual void updateVisibleRangeDisplay(Pane *p) const;
+};
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/PreferencesDialog.cpp	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,379 @@
+/* -*- 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.
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#include "PreferencesDialog.h"
+
+#include <QGridLayout>
+#include <QComboBox>
+#include <QCheckBox>
+#include <QGroupBox>
+#include <QDoubleSpinBox>
+#include <QLabel>
+#include <QPushButton>
+#include <QHBoxLayout>
+#include <QString>
+#include <QDialogButtonBox>
+#include <QMessageBox>
+#include <QTabWidget>
+#include <QLineEdit>
+#include <QFileDialog>
+#include <QMessageBox>
+
+#include "widgets/WindowTypeSelector.h"
+#include "widgets/IconLoader.h"
+#include "base/Preferences.h"
+
+PreferencesDialog::PreferencesDialog(QWidget *parent, Qt::WFlags flags) :
+    QDialog(parent, flags),
+    m_changesOnRestart(false)
+{
+    setWindowTitle(tr("Sonic Visualiser: Application Preferences"));
+
+    Preferences *prefs = Preferences::getInstance();
+
+    QGridLayout *grid = new QGridLayout;
+    setLayout(grid);
+
+    QTabWidget *tab = new QTabWidget;
+    grid->addWidget(tab, 0, 0);
+    
+    tab->setTabPosition(QTabWidget::North);
+
+    // Create this first, as slots that get called from the ctor will
+    // refer to it
+    m_applyButton = new QPushButton(tr("Apply"));
+
+    // Create all the preference widgets first, then create the
+    // individual tab widgets and place the preferences in their
+    // appropriate places in one go afterwards
+
+    int min, max, deflt, i;
+
+    m_windowType = WindowType(prefs->getPropertyRangeAndValue
+                              ("Window Type", &min, &max, &deflt));
+    m_windowTypeSelector = new WindowTypeSelector(m_windowType);
+
+    connect(m_windowTypeSelector, SIGNAL(windowTypeChanged(WindowType)),
+            this, SLOT(windowTypeChanged(WindowType)));
+
+    QComboBox *smoothing = new QComboBox;
+    
+    int sm = prefs->getPropertyRangeAndValue("Spectrogram Smoothing", &min, &max,
+                                             &deflt);
+    m_spectrogramSmoothing = sm;
+
+    for (i = min; i <= max; ++i) {
+        smoothing->addItem(prefs->getPropertyValueLabel("Spectrogram Smoothing", i));
+    }
+
+    smoothing->setCurrentIndex(sm);
+
+    connect(smoothing, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(spectrogramSmoothingChanged(int)));
+
+    QComboBox *propertyLayout = new QComboBox;
+    int pl = prefs->getPropertyRangeAndValue("Property Box Layout", &min, &max,
+                                         &deflt);
+    m_propertyLayout = pl;
+
+    for (i = min; i <= max; ++i) {
+        propertyLayout->addItem(prefs->getPropertyValueLabel("Property Box Layout", i));
+    }
+
+    propertyLayout->setCurrentIndex(pl);
+
+    connect(propertyLayout, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(propertyLayoutChanged(int)));
+
+    m_tuningFrequency = prefs->getTuningFrequency();
+
+    QDoubleSpinBox *frequency = new QDoubleSpinBox;
+    frequency->setMinimum(100.0);
+    frequency->setMaximum(5000.0);
+    frequency->setSuffix(" Hz");
+    frequency->setSingleStep(1);
+    frequency->setValue(m_tuningFrequency);
+    frequency->setDecimals(2);
+
+    connect(frequency, SIGNAL(valueChanged(double)),
+            this, SLOT(tuningFrequencyChanged(double)));
+
+    QComboBox *resampleQuality = new QComboBox;
+
+    int rsq = prefs->getPropertyRangeAndValue("Resample Quality", &min, &max,
+                                              &deflt);
+    m_resampleQuality = rsq;
+
+    for (i = min; i <= max; ++i) {
+        resampleQuality->addItem(prefs->getPropertyValueLabel("Resample Quality", i));
+    }
+
+    resampleQuality->setCurrentIndex(rsq);
+
+    connect(resampleQuality, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(resampleQualityChanged(int)));
+
+    QCheckBox *resampleOnLoad = new QCheckBox;
+    m_resampleOnLoad = prefs->getResampleOnLoad();
+    resampleOnLoad->setCheckState(m_resampleOnLoad ? Qt::Checked :
+                                  Qt::Unchecked);
+    connect(resampleOnLoad, SIGNAL(stateChanged(int)),
+            this, SLOT(resampleOnLoadChanged(int)));
+
+    m_tempDirRootEdit = new QLineEdit;
+    QString dir = prefs->getTemporaryDirectoryRoot();
+    m_tempDirRoot = dir;
+    dir.replace("$HOME", tr("<home directory>"));
+    m_tempDirRootEdit->setText(dir);
+    m_tempDirRootEdit->setReadOnly(true);
+    QPushButton *tempDirButton = new QPushButton;
+    tempDirButton->setIcon(IconLoader().load("fileopen"));
+    connect(tempDirButton, SIGNAL(clicked()),
+            this, SLOT(tempDirButtonClicked()));
+    tempDirButton->setFixedSize(QSize(24, 24));
+
+    QComboBox *bgMode = new QComboBox;
+    int bg = prefs->getPropertyRangeAndValue("Background Mode", &min, &max,
+                                             &deflt);
+    m_backgroundMode = bg;
+    for (i = min; i <= max; ++i) {
+        bgMode->addItem(prefs->getPropertyValueLabel("Background Mode", i));
+    }
+    bgMode->setCurrentIndex(bg);
+
+    connect(bgMode, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(backgroundModeChanged(int)));
+
+    // General tab
+
+    QFrame *frame = new QFrame;
+    
+    QGridLayout *subgrid = new QGridLayout;
+    frame->setLayout(subgrid);
+
+    int row = 0;
+
+    subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
+                                                ("Property Box Layout"))),
+                       row, 0);
+    subgrid->addWidget(propertyLayout, row++, 1, 1, 2);
+
+    subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
+                                                ("Background Mode"))),
+                       row, 0);
+    subgrid->addWidget(bgMode, row++, 1, 1, 2);
+
+    subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
+                                                ("Resample On Load"))),
+                       row, 0);
+    subgrid->addWidget(resampleOnLoad, row++, 1, 1, 1);
+
+    subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
+                                                ("Resample Quality"))),
+                       row, 0);
+    subgrid->addWidget(resampleQuality, row++, 1, 1, 2);
+
+    subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
+                                                ("Temporary Directory Root"))),
+                       row, 0);
+    subgrid->addWidget(m_tempDirRootEdit, row, 1, 1, 1);
+    subgrid->addWidget(tempDirButton, row, 2, 1, 1);
+    row++;
+
+    subgrid->setRowStretch(row, 10);
+    
+    tab->addTab(frame, tr("&General"));
+
+    // Analysis tab
+
+    frame = new QFrame;
+    subgrid = new QGridLayout;
+    frame->setLayout(subgrid);
+    row = 0;
+
+    subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
+                                                ("Tuning Frequency"))),
+                       row, 0);
+    subgrid->addWidget(frequency, row++, 1, 1, 2);
+
+    subgrid->addWidget(new QLabel(prefs->getPropertyLabel
+                                  ("Spectrogram Smoothing")),
+                       row, 0);
+    subgrid->addWidget(smoothing, row++, 1, 1, 2);
+
+    subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
+                                                ("Window Type"))),
+                       row, 0);
+    subgrid->addWidget(m_windowTypeSelector, row++, 1, 2, 2);
+    subgrid->setRowStretch(row, 10);
+    row++;
+    
+    subgrid->setRowStretch(row, 10);
+    
+    tab->addTab(frame, tr("&Analysis"));
+
+    QDialogButtonBox *bb = new QDialogButtonBox(Qt::Horizontal);
+    grid->addWidget(bb, 1, 0);
+    
+    QPushButton *ok = new QPushButton(tr("OK"));
+    QPushButton *cancel = new QPushButton(tr("Cancel"));
+    bb->addButton(ok, QDialogButtonBox::AcceptRole);
+    bb->addButton(m_applyButton, QDialogButtonBox::ApplyRole);
+    bb->addButton(cancel, QDialogButtonBox::RejectRole);
+    connect(ok, SIGNAL(clicked()), this, SLOT(okClicked()));
+    connect(m_applyButton, SIGNAL(clicked()), this, SLOT(applyClicked()));
+    connect(cancel, SIGNAL(clicked()), this, SLOT(cancelClicked()));
+
+    m_applyButton->setEnabled(false);
+}
+
+PreferencesDialog::~PreferencesDialog()
+{
+    std::cerr << "PreferencesDialog::~PreferencesDialog()" << std::endl;
+}
+
+void
+PreferencesDialog::windowTypeChanged(WindowType type)
+{
+    m_windowType = type;
+    m_applyButton->setEnabled(true);
+}
+
+void
+PreferencesDialog::spectrogramSmoothingChanged(int smoothing)
+{
+    m_spectrogramSmoothing = smoothing;
+    m_applyButton->setEnabled(true);
+}
+
+void
+PreferencesDialog::propertyLayoutChanged(int layout)
+{
+    m_propertyLayout = layout;
+    m_applyButton->setEnabled(true);
+}
+
+void
+PreferencesDialog::tuningFrequencyChanged(double freq)
+{
+    m_tuningFrequency = freq;
+    m_applyButton->setEnabled(true);
+}
+
+void
+PreferencesDialog::resampleQualityChanged(int q)
+{
+    m_resampleQuality = q;
+    m_applyButton->setEnabled(true);
+}
+
+void
+PreferencesDialog::resampleOnLoadChanged(int state)
+{
+    m_resampleOnLoad = (state == Qt::Checked);
+    m_applyButton->setEnabled(true);
+    m_changesOnRestart = true;
+}
+
+void
+PreferencesDialog::tempDirRootChanged(QString r)
+{
+    m_tempDirRoot = r;
+    m_applyButton->setEnabled(true);
+}
+
+void
+PreferencesDialog::tempDirButtonClicked()
+{
+    QString dir = QFileDialog::getExistingDirectory
+        (this, tr("Select a directory to create cache subdirectory in"),
+         m_tempDirRoot);
+    if (dir == "") return;
+    m_tempDirRootEdit->setText(dir);
+    tempDirRootChanged(dir);
+    m_changesOnRestart = true;
+}
+
+void
+PreferencesDialog::backgroundModeChanged(int mode)
+{
+    m_backgroundMode = mode;
+    m_applyButton->setEnabled(true);
+    m_changesOnRestart = true;
+}
+
+void
+PreferencesDialog::okClicked()
+{
+    applyClicked();
+    accept();
+}
+
+void
+PreferencesDialog::applyClicked()
+{
+    Preferences *prefs = Preferences::getInstance();
+    prefs->setWindowType(WindowType(m_windowType));
+    prefs->setSpectrogramSmoothing(Preferences::SpectrogramSmoothing
+                                   (m_spectrogramSmoothing));
+    prefs->setPropertyBoxLayout(Preferences::PropertyBoxLayout
+                                (m_propertyLayout));
+    prefs->setTuningFrequency(m_tuningFrequency);
+    prefs->setResampleQuality(m_resampleQuality);
+    prefs->setResampleOnLoad(m_resampleOnLoad);
+    prefs->setTemporaryDirectoryRoot(m_tempDirRoot);
+    prefs->setBackgroundMode(Preferences::BackgroundMode(m_backgroundMode));
+
+    m_applyButton->setEnabled(false);
+
+    if (m_changesOnRestart) {
+        QMessageBox::information(this, tr("Preferences"),
+                                 tr("One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.\nPlease exit and restart the application now if you want these changes to take effect immediately."));
+        m_changesOnRestart = false;
+    }
+}    
+
+void
+PreferencesDialog::cancelClicked()
+{
+    reject();
+}
+
+void
+PreferencesDialog::applicationClosing(bool quickly)
+{
+    if (quickly) {
+        reject();
+        return;
+    }
+
+    if (m_applyButton->isEnabled()) {
+        int rv = QMessageBox::warning
+            (this, tr("Preferences Changed"),
+             tr("Some preferences have been changed but not applied.\n"
+                "Apply them before closing?"),
+             QMessageBox::Apply | QMessageBox::Discard,
+             QMessageBox::Discard);
+        if (rv == QMessageBox::Apply) {
+            applyClicked();
+            accept();
+        } else {
+            reject();
+        }
+    } else {
+        accept();
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/PreferencesDialog.h	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,72 @@
+/* -*- 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.
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#ifndef _PREFERENCES_DIALOG_H_
+#define _PREFERENCES_DIALOG_H_
+
+#include <QDialog>
+
+#include "base/Window.h"
+
+class WindowTypeSelector;
+class QPushButton;
+class QLineEdit;
+
+class PreferencesDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    PreferencesDialog(QWidget *parent = 0, Qt::WFlags flags = 0);
+    virtual ~PreferencesDialog();
+
+public slots:
+    void applicationClosing(bool quickly);
+
+protected slots:
+    void windowTypeChanged(WindowType type);
+    void spectrogramSmoothingChanged(int state);
+    void propertyLayoutChanged(int layout);
+    void tuningFrequencyChanged(double freq);
+    void resampleQualityChanged(int quality);
+    void resampleOnLoadChanged(int state);
+    void tempDirRootChanged(QString root);
+    void backgroundModeChanged(int mode);
+
+    void tempDirButtonClicked();
+
+    void okClicked();
+    void applyClicked();
+    void cancelClicked();
+
+protected:
+    WindowTypeSelector *m_windowTypeSelector;
+    QPushButton *m_applyButton;
+
+    QLineEdit *m_tempDirRootEdit;
+    
+    WindowType m_windowType;
+    int m_spectrogramSmoothing;
+    int m_propertyLayout;
+    float m_tuningFrequency;
+    int m_resampleQuality;
+    bool m_resampleOnLoad;
+    QString m_tempDirRoot;
+    int m_backgroundMode;
+
+    bool m_changesOnRestart;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/main.cpp	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,239 @@
+/* -*- 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 "MainWindow.h"
+
+#include "system/System.h"
+#include "system/Init.h"
+#include "base/TempDirectory.h"
+#include "base/PropertyContainer.h"
+#include "base/Preferences.h"
+#include "widgets/TipDialog.h"
+
+#include <QMetaType>
+#include <QApplication>
+#include <QDesktopWidget>
+#include <QMessageBox>
+#include <QTranslator>
+#include <QLocale>
+#include <QSettings>
+#include <QIcon>
+#include <QSessionManager>
+#include <QDir>
+
+#include <iostream>
+#include <signal.h>
+
+static QMutex cleanupMutex;
+
+static void
+signalHandler(int /* signal */)
+{
+    // Avoid this happening more than once across threads
+
+    cleanupMutex.lock();
+    std::cerr << "signalHandler: cleaning up and exiting" << std::endl;
+    TempDirectory::getInstance()->cleanup();
+    exit(0); // without releasing mutex
+}
+
+class VectApplication : public QApplication
+{
+public:
+    VectApplication(int argc, char **argv) :
+        QApplication(argc, argv),
+        m_mainWindow(0) { }
+    virtual ~VectApplication() { }
+
+    void setMainWindow(MainWindow *mw) { m_mainWindow = mw; }
+    void releaseMainWindow() { m_mainWindow = 0; }
+
+    virtual void commitData(QSessionManager &manager) {
+        if (!m_mainWindow) return;
+        bool mayAskUser = manager.allowsInteraction();
+        bool success = m_mainWindow->commitData(mayAskUser);
+        manager.release();
+        if (!success) manager.cancel();
+    }
+
+protected:
+    MainWindow *m_mainWindow;
+};
+
+int
+main(int argc, char **argv)
+{
+    StoreStartupLocale();
+
+    VectApplication application(argc, argv);
+
+    QStringList args = application.arguments();
+
+    signal(SIGINT,  signalHandler);
+    signal(SIGTERM, signalHandler);
+
+#ifndef Q_WS_WIN32
+    signal(SIGHUP,  signalHandler);
+    signal(SIGQUIT, signalHandler);
+#endif
+
+    svSystemSpecificInitialisation();
+
+    bool audioOutput = true;
+    bool oscSupport = false;
+
+    if (args.contains("--help") || args.contains("-h") || args.contains("-?")) {
+        std::cerr << QApplication::tr(
+            "\nSonic Visualiser is a program for viewing and exploring audio data\nfor semantic music analysis and annotation.\n\nUsage:\n\n  %1 [--no-audio] [--no-osc] [<file> ...]\n\n  --no-audio: Do not attempt to open an audio output device\n  --no-osc: Do not provide an Open Sound Control port for remote control\n  <file>: One or more Sonic Visualiser (.sv) and audio files may be provided.\n").arg(argv[0]).toStdString() << std::endl;
+        exit(2);
+    }
+
+    if (args.contains("--no-audio")) audioOutput = false;
+//    if (args.contains("--no-osc")) oscSupport = false;
+
+    QApplication::setOrganizationName("sonic-visualiser");
+    QApplication::setOrganizationDomain("sonicvisualiser.org");
+    QApplication::setApplicationName("Vect");
+
+    QIcon icon;
+    int sizes[] = { 16, 22, 24, 32, 48, 64, 128 };
+    for (int i = 0; i < sizeof(sizes)/sizeof(sizes[0]); ++i) {
+        icon.addFile(QString(":icons/sv-%1x%2.png").arg(sizes[i]).arg(sizes[i]));
+    }
+    QApplication::setWindowIcon(icon);
+
+    QString language = QLocale::system().name();
+
+    QTranslator qtTranslator;
+    QString qtTrName = QString("qt_%1").arg(language);
+    std::cerr << "Loading " << qtTrName.toStdString() << "..." << std::endl;
+    bool success = false;
+    if (!(success = qtTranslator.load(qtTrName))) {
+        QString qtDir = getenv("QTDIR");
+        if (qtDir != "") {
+            success = qtTranslator.load
+                (qtTrName, QDir(qtDir).filePath("translations"));
+        }
+    }
+    if (!success) {
+        std::cerr << "Failed to load Qt translation for locale" << std::endl;
+    }
+    application.installTranslator(&qtTranslator);
+
+    //!!! load sv translations, plus vect translations
+    QTranslator svTranslator;
+    QString svTrName = QString("sonic-visualiser_%1").arg(language);
+    std::cerr << "Loading " << svTrName.toStdString() << "..." << std::endl;
+    svTranslator.load(svTrName, ":i18n");
+    application.installTranslator(&svTranslator);
+
+    // Permit size_t and PropertyName to be used as args in queued signal calls
+    qRegisterMetaType<size_t>("size_t");
+    qRegisterMetaType<PropertyContainer::PropertyName>("PropertyContainer::PropertyName");
+
+    MainWindow gui(audioOutput, oscSupport);
+    application.setMainWindow(&gui);
+
+    QDesktopWidget *desktop = QApplication::desktop();
+    QRect available = desktop->availableGeometry();
+
+    int width = available.width() * 2 / 3;
+    int height = available.height() / 2;
+    if (height < 450) height = available.height() * 2 / 3;
+    if (width > height * 2) width = height * 2;
+
+    QSettings settings;
+    settings.beginGroup("MainWindow");
+    QSize size = settings.value("size", QSize(width, height)).toSize();
+    gui.resize(size);
+    if (settings.contains("position")) {
+        gui.move(settings.value("position").toPoint());
+    }
+    settings.endGroup();
+    
+    gui.show();
+
+    bool haveSession = false;
+    bool haveMainModel = false;
+    bool havePriorCommandLineModel = false;
+
+    for (QStringList::iterator i = args.begin(); i != args.end(); ++i) {
+
+        MainWindow::FileOpenStatus status = MainWindow::FileOpenFailed;
+
+        if (i == args.begin()) continue;
+        if (i->startsWith('-')) continue;
+
+        if (i->startsWith("http:") || i->startsWith("ftp:")) {
+            std::cerr << "opening URL: \"" << i->toStdString() << "\"..." << std::endl;
+            status = gui.open(*i);
+            continue;
+        }
+
+        QString path = *i;
+
+        if (path.endsWith("sv")) {
+            if (!haveSession) {
+                status = gui.openSessionFile(path);
+                if (status == MainWindow::FileOpenSucceeded) {
+                    haveSession = true;
+                    haveMainModel = true;
+                }
+            } else {
+                std::cerr << "WARNING: Ignoring additional session file argument \"" << path.toStdString() << "\"" << std::endl;
+                status = MainWindow::FileOpenSucceeded;
+            }
+        }
+        if (status != MainWindow::FileOpenSucceeded) {
+            if (!haveMainModel) {
+                status = gui.open(path, MainWindow::ReplaceMainModel);
+                if (status == MainWindow::FileOpenSucceeded) {
+                    haveMainModel = true;
+                }
+            } else {
+                if (haveSession && !havePriorCommandLineModel) {
+                    status = gui.open(path, MainWindow::AskUser);
+                    if (status == MainWindow::FileOpenSucceeded) {
+                        havePriorCommandLineModel = true;
+                    }
+                } else {
+                    status = gui.open(path, MainWindow::CreateAdditionalModel);
+                }
+            }
+        }
+        if (status == MainWindow::FileOpenFailed) {
+	    QMessageBox::critical
+                (&gui, QMessageBox::tr("Failed to open file"),
+                 QMessageBox::tr("File \"%1\" could not be opened").arg(path));
+        }
+    }
+    
+
+
+/*
+    TipDialog tipDialog;
+    if (tipDialog.isOK()) {
+        tipDialog.exec();
+    }
+*/
+    int rv = application.exec();
+//    std::cerr << "application.exec() returned " << rv << std::endl;
+
+    cleanupMutex.lock();
+    TempDirectory::getInstance()->cleanup();
+    application.releaseMainWindow();
+
+    return rv;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/README	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,2 @@
+Samples from standard Hydrogen drum machine kits, except for piano.wav
+(ancestry unknown) and click.wav (random noise).
Binary file samples/bass.wav has changed
Binary file samples/beep.wav has changed
Binary file samples/bounce.wav has changed
Binary file samples/clap.wav has changed
Binary file samples/click.wav has changed
Binary file samples/cowbell.wav has changed
Binary file samples/hihat.wav has changed
Binary file samples/kick.wav has changed
Binary file samples/organ.wav has changed
Binary file samples/piano.wav has changed
Binary file samples/snare.wav has changed
Binary file samples/stick.wav has changed
Binary file samples/strike.wav has changed
Binary file samples/tap.wav has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vect.pro	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,48 @@
+
+TEMPLATE = app
+
+SV_UNIT_PACKAGES = vamp vamp-hostsdk fftw3f samplerate libpulse jack portaudio-2.0 mad id3tag oggz fishsound lrdf raptor rasqal redland sndfile liblo rubberband fftw3
+load(../sonic-visualiser/sv.prf)
+
+CONFIG += release sv qt thread warn_on stl rtti exceptions
+QT += xml network
+
+linux-g++:QMAKE_CXXFLAGS_RELEASE += -DNDEBUG -DNO_TIMING -O3 -march=pentium-m -msse -msse2 -msse3 -mmmx
+
+TARGET = vect
+
+ICON = icons/sv-macicon.icns
+
+DEPENDPATH += . ../sonic-visualiser i18n main
+INCLUDEPATH += . ../sonic-visualiser main
+LIBPATH = ../sonic-visualiser/framework ../sonic-visualiser/audioio ../sonic-visualiser/view ../sonic-visualiser/layer ../sonic-visualiser/data ../sonic-visualiser/widgets ../sonic-visualiser/plugin ../sonic-visualiser/transform ../sonic-visualiser/rdf ../sonic-visualiser/base ../sonic-visualiser/system $$LIBPATH
+
+contains(DEFINES, BUILD_STATIC):LIBS -= -ljack
+
+LIBS = -lsvframework -lsvaudioio -lsvview -lsvlayer -lsvwidgets -lsvdata -lsvtransform -lsvrdf -lsvtransform -lsvdata -lsvplugin -lsvbase -lsvsystem $$LIBS
+
+PRE_TARGETDEPS += ../sonic-visualiser/framework/libsvframework.a \
+                  ../sonic-visualiser/audioio/libsvaudioio.a \
+                  ../sonic-visualiser/view/libsvview.a \
+                  ../sonic-visualiser/layer/libsvlayer.a \
+                  ../sonic-visualiser/rdf/libsvrdf.a \
+                  ../sonic-visualiser/data/libsvdata.a \
+                  ../sonic-visualiser/widgets/libsvwidgets.a \
+                  ../sonic-visualiser/transform/libsvtransform.a \
+                  ../sonic-visualiser/plugin/libsvplugin.a \
+                  ../sonic-visualiser/base/libsvbase.a \
+                  ../sonic-visualiser/system/libsvsystem.a
+
+OBJECTS_DIR = tmp_obj
+MOC_DIR = tmp_moc
+
+# Input
+HEADERS += main/MainWindow.h \
+           main/PreferencesDialog.h
+SOURCES += main/main.cpp \
+           main/MainWindow.cpp \
+           main/PreferencesDialog.cpp
+
+RESOURCES += vect.qrc
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vect.qrc	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,92 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+    <file>icons/waveform.png</file>
+    <file>icons/spectrum.png</file>
+    <file>icons/spectrogram.png</file>
+    <file>icons/melodogram.png</file>
+    <file>icons/timeruler.png</file>
+    <file>icons/pane.png</file>
+    <file>icons/instants.png</file>
+    <file>icons/notes.png</file>
+    <file>icons/values.png</file>
+    <file>icons/colour3d.png</file>
+    <file>icons/playpause.png</file>
+    <file>icons/ffwd.png</file>
+    <file>icons/ffwd-end.png</file>
+    <file>icons/rewind.png</file>
+    <file>icons/rewind-start.png</file>
+    <file>icons/playselection.png</file>
+    <file>icons/playloop.png</file>
+    <file>icons/solo.png</file>
+    <file>icons/fader_background.png</file>
+    <file>icons/fader_knob.png</file>
+    <file>icons/fader_knob_red.png</file>
+    <file>icons/fader_leds.png</file>
+    <file>icons/faders.png</file>
+    <file>icons/select.png</file>
+    <file>icons/text.png</file>
+    <file>icons/draw.png</file>
+    <file>icons/draw-curve.png</file>
+    <file>icons/measure.png</file>
+    <file>icons/measure1cursor.xbm</file>
+    <file>icons/measure1mask.xbm</file>
+    <file>icons/measure2cursor.xbm</file>
+    <file>icons/measure2mask.xbm</file>
+    <file>icons/move.png</file>
+    <file>icons/navigate.png</file>
+    <file>icons/zoom.png</file>
+    <file>icons/zoom-in.png</file>
+    <file>icons/zoom-out.png</file>
+    <file>icons/zoom-fit.png</file>
+    <file>icons/undo.png</file>
+    <file>icons/redo.png</file>
+    <file>icons/new.png</file>
+    <file>icons/exit.png</file>
+    <file>icons/speaker.png</file>
+    <file>icons/annotation.png</file>
+    <file>icons/fileopen.png</file>
+    <file>icons/fileopensession.png</file>
+    <file>icons/fileopenaudio.png</file>
+    <file>icons/fileopen-22.png</file>
+    <file>icons/fileclose.png</file>
+    <file>icons/filenew.png</file>
+    <file>icons/filenew-22.png</file>
+    <file>icons/filesave.png</file>
+    <file>icons/filesave-22.png</file>
+    <file>icons/filesaveas.png</file>
+    <file>icons/filesaveas-22.png</file>
+    <file>icons/editdelete.png</file>
+    <file>icons/editcut.png</file>
+    <file>icons/editcopy.png</file>
+    <file>icons/editpaste.png</file>
+    <file>icons/mono.png</file>
+    <file>icons/stereo.png</file>
+    <file>icons/sharpen.png</file>
+    <file>icons/help.png</file>
+    <file>icons/cross.png</file>
+    <file>icons/sv-16x16.png</file>
+    <file>icons/sv-22x22.png</file>
+    <file>icons/sv-24x24.png</file>
+    <file>icons/sv-32x32.png</file>
+    <file>icons/sv-48x48.png</file>
+    <file>icons/sv-64x64.png</file>
+    <file>icons/sv-128x128.png</file>
+    <file>samples/bass.wav</file>
+    <file>samples/beep.wav</file>
+    <file>samples/bounce.wav</file>
+    <file>samples/clap.wav</file>
+    <file>samples/click.wav</file>
+    <file>samples/cowbell.wav</file>
+    <file>samples/hihat.wav</file>
+    <file>samples/kick.wav</file>
+    <file>samples/organ.wav</file>
+    <file>samples/piano.wav</file>
+    <file>samples/snare.wav</file>
+    <file>samples/stick.wav</file>
+    <file>samples/strike.wav</file>
+    <file>samples/tap.wav</file>
+    <file>i18n/sonic-visualiser_ru.qm</file>
+    <file>i18n/sonic-visualiser_en_GB.qm</file>
+    <file>i18n/tips_en.xml</file>
+</qresource>
+</RCC>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/version.h	Fri Mar 27 12:41:49 2009 +0000
@@ -0,0 +1,1 @@
+#define VECT_VERSION "[vect] 0.1"