├── version.h ├── pitch-track-align ├── main.sml ├── pitch-track-align.mlb ├── Makefile ├── note-track.ttl ├── pitch-track.ttl └── pitch-track-align.sh ├── deploy ├── osx │ ├── qt.conf │ ├── Entitlements.plist │ ├── sign.sh │ ├── copy-qt.sh │ ├── notarize.sh │ ├── paths.sh │ ├── deploy-and-package.sh │ ├── deploy.sh │ └── Info.plist ├── win64 │ ├── main.bmp │ ├── top.bmp │ ├── README-Vamp.txt │ ├── generate-wxs.ps1 │ ├── build-64.bat │ ├── build-and-package.bat │ └── build-64-debug.bat ├── linux │ ├── deb-skeleton │ │ ├── usr │ │ │ ├── lib │ │ │ │ └── sonic-lineup │ │ │ │ │ └── README │ │ │ └── share │ │ │ │ ├── doc │ │ │ │ └── sonic-lineup │ │ │ │ │ ├── changelog.Debian.gz │ │ │ │ │ └── copyright │ │ │ │ └── applications │ │ │ │ └── sonic-lineup.desktop │ │ └── DEBIAN │ │ │ └── control │ ├── fix-lintian-bits.sh │ ├── docker │ │ ├── Dockerfile_test_deb.in │ │ ├── Dockerfile_test_appimage.in │ │ ├── Dockerfile_deb.in │ │ └── Dockerfile_appimage.in │ ├── AppRun │ ├── debian-dependencies.sh │ ├── build-and-test-appimage.sh │ ├── build-and-test-deb.sh │ ├── deploy-deb.sh │ └── deploy-appimage.sh ├── src │ ├── update-i18n.sh │ └── archive.sh ├── clean-build-and-package.bat └── clean-build-and-package ├── bootstrap.sh ├── icons ├── sonic-lineup.rc ├── draw.png ├── exit.png ├── ffwd.png ├── help.png ├── info.png ├── mono.png ├── move.png ├── new.png ├── pane.png ├── redo.png ├── solo.png ├── text.png ├── undo.png ├── zoom.png ├── align.png ├── cross.png ├── faders.png ├── notes.png ├── rewind.png ├── select.png ├── stereo.png ├── values.png ├── align-on.png ├── colour3d.png ├── editcopy.png ├── editcut.png ├── editpaste.png ├── ffwd-end.png ├── fileclose.png ├── filenew.png ├── fileopen.png ├── filesave.png ├── instants.png ├── measure.png ├── navigate.png ├── playloop.png ├── playpause.png ├── sharpen.png ├── speaker.png ├── spectrum.png ├── sv-16x16.png ├── sv-22x22.png ├── sv-24x24.png ├── sv-32x32.png ├── sv-48x48.png ├── sv-64x64.png ├── svicon16.png ├── svicon32.png ├── timeruler.png ├── waveform.png ├── zoom-fit.png ├── zoom-in.png ├── zoom-out.png ├── annotation.png ├── draw-curve.png ├── editdelete.png ├── fader_knob.png ├── fader_leds.png ├── filenew-22.png ├── fileopen-22.png ├── filesave-22.png ├── filesaveas.png ├── melodogram.png ├── spectrogram.png ├── style │ ├── frame.png │ ├── arrow-up.png │ ├── pagefold.png │ ├── sizegrip.png │ ├── spindown.png │ ├── spinup.png │ ├── tooltip.png │ ├── up_arrow.png │ ├── arrow-down.png │ ├── arrow-left.png │ ├── down_arrow.png │ ├── spinup_off.png │ ├── tab-close.png │ ├── arrow-right.png │ ├── spindown_off.png │ ├── spinup_hover.png │ ├── title-close.png │ ├── title-undock.png │ ├── arrow-up-small.png │ ├── combo-dropdown.png │ ├── golden-arrow-up.png │ ├── spindown_hover.png │ ├── spinup_pressed.png │ ├── arrow-down-small.png │ ├── arrow-left-small.png │ ├── arrow-right-small.png │ ├── arrow-up-inverted.png │ ├── checkbox_checked.png │ ├── checkbox_disabled.png │ ├── checkbox_unchecked.png │ ├── golden-arrow-left.png │ ├── golden-arrow-right.png │ ├── htoolbar-separator.png │ ├── spindown_pressed.png │ ├── tab-scroll-button.png │ ├── up_arrow_disabled.png │ ├── vtoolbar-separator.png │ ├── arrow-left-inverted.png │ ├── arrow-right-inverted.png │ ├── connect-button-arrow.png │ ├── down_arrow_disabled.png │ ├── golden-arrow-left-up.png │ ├── header-close-button.png │ ├── messagebox-critical.png │ ├── messagebox-question.png │ ├── radiobutton_checked.png │ ├── toolbar-horiz-pixmap.png │ ├── toolbar-vert-pixmap.png │ ├── arrow-up-small-inverted.png │ ├── checkbox_checked_hover.png │ ├── checkbox_indeterminate.png │ ├── messagebox-information.png │ ├── radiobutton_unchecked.png │ ├── tab-scroll-button-hover.png │ ├── arrow-down-small-inverted.png │ ├── arrow-left-small-inverted.png │ ├── checkbox_checked_disabled.png │ ├── checkbox_checked_pressed.png │ ├── checkbox_unchecked_hover.png │ ├── radiobutton_checked_hover.png │ ├── arrow-right-small-inverted.png │ ├── checkbox_indeterminate_hover.png │ ├── checkbox_unchecked_pressed.png │ ├── radiobutton_checked_disabled.png │ ├── radiobutton_checked_pressed.png │ ├── radiobutton_unchecked_hover.png │ ├── tab-scroll-button-disabled.png │ ├── checkbox_indeterminate_pressed.png │ ├── radiobutton_unchecked_disabled.png │ ├── radiobutton_unchecked_pressed.png │ ├── radiobutton_checked_hover_disabled.png │ ├── radiobutton_checked_pressed_disabled.png │ ├── radiobutton_unchecked_hover_disabled.png │ └── radiobutton_unchecked_pressed_disabled.png ├── sv-128x128.png ├── sv-macicon.icns ├── sv-winicon.ico ├── fader_knob_red.png ├── fileopenaudio.png ├── filesaveas-22.png ├── playpause-orig.png ├── playselection.png ├── rewind-start.png ├── fader_background.png ├── fileopensession.png ├── qm-logo-smaller.png ├── playselectionloop.png ├── sonic-lineup-icon.icns ├── sonic-lineup-icon.ico ├── spectrogram-22x22.png ├── qm-logo-smaller-white.png ├── sonic-lineup-icon-16x16.png ├── sonic-lineup-icon-22x22.png ├── sonic-lineup-icon-24x24.png ├── sonic-lineup-icon-32x32.png ├── sonic-lineup-icon-48x48.png ├── sonic-lineup-icon-64x64.png ├── sonic-lineup-icon-128x128.png ├── README ├── measure1mask.xbm ├── measure2mask.xbm ├── measure1cursor.xbm └── measure2cursor.xbm ├── i18n ├── vect_ru.qm ├── ru.lproj │ └── InfoPlist.strings ├── vect_cs_CZ.qm ├── vect_en_GB.qm ├── vect_en_US.qm ├── cs.lproj │ └── InfoPlist.strings ├── en.lproj │ └── InfoPlist.strings └── tips_en.xml ├── samples ├── bass.wav ├── beep.wav ├── clap.wav ├── kick.wav ├── tap.wav ├── bounce.wav ├── click.wav ├── cowbell.wav ├── hihat.wav ├── organ.wav ├── piano.wav ├── snare.wav ├── stick.wav ├── strike.wav └── README ├── repoint.bat ├── repoint.pri ├── os-other.pro ├── sonic-lineup.desktop ├── os-win10.pro ├── config.pri.in ├── test-svcore-base.pro ├── test-svcore-system.pro ├── platform-dataquay.pri ├── test-svcore-data-fileio.pro ├── test-svcore-data-model.pro ├── main ├── IntroDialog.h ├── NetworkPermissionTester.h ├── SmallSession.h ├── PreferencesDialog.h ├── NetworkPermissionTester.cpp ├── SmallSession.cpp ├── IntroDialog.cpp └── PreferencesDialog.cpp ├── .appveyor.yml ├── .hgtags ├── base.pri ├── azi.pro ├── .hgignore ├── vamp-plugin-sdk-files.pri ├── convert.pro ├── server.pro ├── nnls-chroma.pro ├── pyin.pro ├── sonic-lineup.pro ├── README.md ├── repoint-lock.json ├── .travis.yml ├── capnp-regen.pri ├── bq-files.pri ├── base.pro ├── tuning-difference.pro ├── match.pro ├── CHANGELOG ├── vectapp.pro ├── repoint.ps1 ├── repoint-project.json ├── noconfig.pri ├── repoint ├── vect-mac.qss └── configure.ac /version.h: -------------------------------------------------------------------------------- 1 | #define VECT_VERSION "1.1" 2 | -------------------------------------------------------------------------------- /pitch-track-align/main.sml: -------------------------------------------------------------------------------- 1 | val _ = main () 2 | -------------------------------------------------------------------------------- /deploy/osx/qt.conf: -------------------------------------------------------------------------------- 1 | [Paths] 2 | Plugins = plugins 3 | -------------------------------------------------------------------------------- /bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | aclocal -I . && autoconf 3 | -------------------------------------------------------------------------------- /icons/sonic-lineup.rc: -------------------------------------------------------------------------------- 1 | IDI_ICON1 ICON DISCARDABLE "sonic-lineup-icon.ico" 2 | -------------------------------------------------------------------------------- /icons/draw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/draw.png -------------------------------------------------------------------------------- /icons/exit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/exit.png -------------------------------------------------------------------------------- /icons/ffwd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/ffwd.png -------------------------------------------------------------------------------- /icons/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/help.png -------------------------------------------------------------------------------- /icons/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/info.png -------------------------------------------------------------------------------- /icons/mono.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/mono.png -------------------------------------------------------------------------------- /icons/move.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/move.png -------------------------------------------------------------------------------- /icons/new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/new.png -------------------------------------------------------------------------------- /icons/pane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/pane.png -------------------------------------------------------------------------------- /icons/redo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/redo.png -------------------------------------------------------------------------------- /icons/solo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/solo.png -------------------------------------------------------------------------------- /icons/text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/text.png -------------------------------------------------------------------------------- /icons/undo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/undo.png -------------------------------------------------------------------------------- /icons/zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/zoom.png -------------------------------------------------------------------------------- /i18n/vect_ru.qm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/i18n/vect_ru.qm -------------------------------------------------------------------------------- /icons/align.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/align.png -------------------------------------------------------------------------------- /icons/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/cross.png -------------------------------------------------------------------------------- /icons/faders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/faders.png -------------------------------------------------------------------------------- /icons/notes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/notes.png -------------------------------------------------------------------------------- /icons/rewind.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/rewind.png -------------------------------------------------------------------------------- /icons/select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/select.png -------------------------------------------------------------------------------- /icons/stereo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/stereo.png -------------------------------------------------------------------------------- /icons/values.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/values.png -------------------------------------------------------------------------------- /samples/bass.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/bass.wav -------------------------------------------------------------------------------- /samples/beep.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/beep.wav -------------------------------------------------------------------------------- /samples/clap.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/clap.wav -------------------------------------------------------------------------------- /samples/kick.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/kick.wav -------------------------------------------------------------------------------- /samples/tap.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/tap.wav -------------------------------------------------------------------------------- /i18n/ru.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | NSMicrophoneUsageDescription = "Это необходимо для записи звука."; 2 | -------------------------------------------------------------------------------- /i18n/vect_cs_CZ.qm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/i18n/vect_cs_CZ.qm -------------------------------------------------------------------------------- /i18n/vect_en_GB.qm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/i18n/vect_en_GB.qm -------------------------------------------------------------------------------- /i18n/vect_en_US.qm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/i18n/vect_en_US.qm -------------------------------------------------------------------------------- /icons/align-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/align-on.png -------------------------------------------------------------------------------- /icons/colour3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/colour3d.png -------------------------------------------------------------------------------- /icons/editcopy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/editcopy.png -------------------------------------------------------------------------------- /icons/editcut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/editcut.png -------------------------------------------------------------------------------- /icons/editpaste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/editpaste.png -------------------------------------------------------------------------------- /icons/ffwd-end.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/ffwd-end.png -------------------------------------------------------------------------------- /icons/fileclose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/fileclose.png -------------------------------------------------------------------------------- /icons/filenew.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/filenew.png -------------------------------------------------------------------------------- /icons/fileopen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/fileopen.png -------------------------------------------------------------------------------- /icons/filesave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/filesave.png -------------------------------------------------------------------------------- /icons/instants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/instants.png -------------------------------------------------------------------------------- /icons/measure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/measure.png -------------------------------------------------------------------------------- /icons/navigate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/navigate.png -------------------------------------------------------------------------------- /icons/playloop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/playloop.png -------------------------------------------------------------------------------- /icons/playpause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/playpause.png -------------------------------------------------------------------------------- /icons/sharpen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sharpen.png -------------------------------------------------------------------------------- /icons/speaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/speaker.png -------------------------------------------------------------------------------- /icons/spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/spectrum.png -------------------------------------------------------------------------------- /icons/sv-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sv-16x16.png -------------------------------------------------------------------------------- /icons/sv-22x22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sv-22x22.png -------------------------------------------------------------------------------- /icons/sv-24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sv-24x24.png -------------------------------------------------------------------------------- /icons/sv-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sv-32x32.png -------------------------------------------------------------------------------- /icons/sv-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sv-48x48.png -------------------------------------------------------------------------------- /icons/sv-64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sv-64x64.png -------------------------------------------------------------------------------- /icons/svicon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/svicon16.png -------------------------------------------------------------------------------- /icons/svicon32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/svicon32.png -------------------------------------------------------------------------------- /icons/timeruler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/timeruler.png -------------------------------------------------------------------------------- /icons/waveform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/waveform.png -------------------------------------------------------------------------------- /icons/zoom-fit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/zoom-fit.png -------------------------------------------------------------------------------- /icons/zoom-in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/zoom-in.png -------------------------------------------------------------------------------- /icons/zoom-out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/zoom-out.png -------------------------------------------------------------------------------- /samples/bounce.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/bounce.wav -------------------------------------------------------------------------------- /samples/click.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/click.wav -------------------------------------------------------------------------------- /samples/cowbell.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/cowbell.wav -------------------------------------------------------------------------------- /samples/hihat.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/hihat.wav -------------------------------------------------------------------------------- /samples/organ.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/organ.wav -------------------------------------------------------------------------------- /samples/piano.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/piano.wav -------------------------------------------------------------------------------- /samples/snare.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/snare.wav -------------------------------------------------------------------------------- /samples/stick.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/stick.wav -------------------------------------------------------------------------------- /samples/strike.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/samples/strike.wav -------------------------------------------------------------------------------- /deploy/win64/main.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/deploy/win64/main.bmp -------------------------------------------------------------------------------- /deploy/win64/top.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/deploy/win64/top.bmp -------------------------------------------------------------------------------- /icons/annotation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/annotation.png -------------------------------------------------------------------------------- /icons/draw-curve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/draw-curve.png -------------------------------------------------------------------------------- /icons/editdelete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/editdelete.png -------------------------------------------------------------------------------- /icons/fader_knob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/fader_knob.png -------------------------------------------------------------------------------- /icons/fader_leds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/fader_leds.png -------------------------------------------------------------------------------- /icons/filenew-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/filenew-22.png -------------------------------------------------------------------------------- /icons/fileopen-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/fileopen-22.png -------------------------------------------------------------------------------- /icons/filesave-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/filesave-22.png -------------------------------------------------------------------------------- /icons/filesaveas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/filesaveas.png -------------------------------------------------------------------------------- /icons/melodogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/melodogram.png -------------------------------------------------------------------------------- /icons/spectrogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/spectrogram.png -------------------------------------------------------------------------------- /icons/style/frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/frame.png -------------------------------------------------------------------------------- /icons/sv-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sv-128x128.png -------------------------------------------------------------------------------- /icons/sv-macicon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sv-macicon.icns -------------------------------------------------------------------------------- /icons/sv-winicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sv-winicon.ico -------------------------------------------------------------------------------- /icons/fader_knob_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/fader_knob_red.png -------------------------------------------------------------------------------- /icons/fileopenaudio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/fileopenaudio.png -------------------------------------------------------------------------------- /icons/filesaveas-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/filesaveas-22.png -------------------------------------------------------------------------------- /icons/playpause-orig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/playpause-orig.png -------------------------------------------------------------------------------- /icons/playselection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/playselection.png -------------------------------------------------------------------------------- /icons/rewind-start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/rewind-start.png -------------------------------------------------------------------------------- /icons/style/arrow-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-up.png -------------------------------------------------------------------------------- /icons/style/pagefold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/pagefold.png -------------------------------------------------------------------------------- /icons/style/sizegrip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/sizegrip.png -------------------------------------------------------------------------------- /icons/style/spindown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/spindown.png -------------------------------------------------------------------------------- /icons/style/spinup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/spinup.png -------------------------------------------------------------------------------- /icons/style/tooltip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/tooltip.png -------------------------------------------------------------------------------- /icons/style/up_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/up_arrow.png -------------------------------------------------------------------------------- /pitch-track-align/pitch-track-align.mlb: -------------------------------------------------------------------------------- 1 | $(SML_LIB)/basis/basis.mlb 2 | pitch-track-align.sml 3 | main.sml 4 | -------------------------------------------------------------------------------- /repoint.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%~dpn0.ps1' %*"; 3 | 4 | -------------------------------------------------------------------------------- /icons/fader_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/fader_background.png -------------------------------------------------------------------------------- /icons/fileopensession.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/fileopensession.png -------------------------------------------------------------------------------- /icons/qm-logo-smaller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/qm-logo-smaller.png -------------------------------------------------------------------------------- /icons/style/arrow-down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-down.png -------------------------------------------------------------------------------- /icons/style/arrow-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-left.png -------------------------------------------------------------------------------- /icons/style/down_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/down_arrow.png -------------------------------------------------------------------------------- /icons/style/spinup_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/spinup_off.png -------------------------------------------------------------------------------- /icons/style/tab-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/tab-close.png -------------------------------------------------------------------------------- /i18n/cs.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | NSMicrophoneUsageDescription = "Sonic Lineup potřebuje pro nahrávání použít mikrofon."; 2 | -------------------------------------------------------------------------------- /icons/playselectionloop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/playselectionloop.png -------------------------------------------------------------------------------- /icons/sonic-lineup-icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sonic-lineup-icon.icns -------------------------------------------------------------------------------- /icons/sonic-lineup-icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sonic-lineup-icon.ico -------------------------------------------------------------------------------- /icons/spectrogram-22x22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/spectrogram-22x22.png -------------------------------------------------------------------------------- /icons/style/arrow-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-right.png -------------------------------------------------------------------------------- /icons/style/spindown_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/spindown_off.png -------------------------------------------------------------------------------- /icons/style/spinup_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/spinup_hover.png -------------------------------------------------------------------------------- /icons/style/title-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/title-close.png -------------------------------------------------------------------------------- /icons/style/title-undock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/title-undock.png -------------------------------------------------------------------------------- /deploy/linux/deb-skeleton/usr/lib/sonic-lineup/README: -------------------------------------------------------------------------------- 1 | Vamp audio analysis plugins for use by the Sonic Lineup application. 2 | -------------------------------------------------------------------------------- /i18n/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | NSMicrophoneUsageDescription = "Sonic Lineup needs to use the microphone for recording."; 2 | -------------------------------------------------------------------------------- /icons/qm-logo-smaller-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/qm-logo-smaller-white.png -------------------------------------------------------------------------------- /icons/style/arrow-up-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-up-small.png -------------------------------------------------------------------------------- /icons/style/combo-dropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/combo-dropdown.png -------------------------------------------------------------------------------- /icons/style/golden-arrow-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/golden-arrow-up.png -------------------------------------------------------------------------------- /icons/style/spindown_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/spindown_hover.png -------------------------------------------------------------------------------- /icons/style/spinup_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/spinup_pressed.png -------------------------------------------------------------------------------- /icons/sonic-lineup-icon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sonic-lineup-icon-16x16.png -------------------------------------------------------------------------------- /icons/sonic-lineup-icon-22x22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sonic-lineup-icon-22x22.png -------------------------------------------------------------------------------- /icons/sonic-lineup-icon-24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sonic-lineup-icon-24x24.png -------------------------------------------------------------------------------- /icons/sonic-lineup-icon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sonic-lineup-icon-32x32.png -------------------------------------------------------------------------------- /icons/sonic-lineup-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sonic-lineup-icon-48x48.png -------------------------------------------------------------------------------- /icons/sonic-lineup-icon-64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sonic-lineup-icon-64x64.png -------------------------------------------------------------------------------- /icons/style/arrow-down-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-down-small.png -------------------------------------------------------------------------------- /icons/style/arrow-left-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-left-small.png -------------------------------------------------------------------------------- /icons/style/arrow-right-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-right-small.png -------------------------------------------------------------------------------- /icons/style/arrow-up-inverted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-up-inverted.png -------------------------------------------------------------------------------- /icons/style/checkbox_checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/checkbox_checked.png -------------------------------------------------------------------------------- /icons/style/checkbox_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/checkbox_disabled.png -------------------------------------------------------------------------------- /icons/style/checkbox_unchecked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/checkbox_unchecked.png -------------------------------------------------------------------------------- /icons/style/golden-arrow-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/golden-arrow-left.png -------------------------------------------------------------------------------- /icons/style/golden-arrow-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/golden-arrow-right.png -------------------------------------------------------------------------------- /icons/style/htoolbar-separator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/htoolbar-separator.png -------------------------------------------------------------------------------- /icons/style/spindown_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/spindown_pressed.png -------------------------------------------------------------------------------- /icons/style/tab-scroll-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/tab-scroll-button.png -------------------------------------------------------------------------------- /icons/style/up_arrow_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/up_arrow_disabled.png -------------------------------------------------------------------------------- /icons/style/vtoolbar-separator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/vtoolbar-separator.png -------------------------------------------------------------------------------- /icons/sonic-lineup-icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/sonic-lineup-icon-128x128.png -------------------------------------------------------------------------------- /icons/style/arrow-left-inverted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-left-inverted.png -------------------------------------------------------------------------------- /icons/style/arrow-right-inverted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-right-inverted.png -------------------------------------------------------------------------------- /icons/style/connect-button-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/connect-button-arrow.png -------------------------------------------------------------------------------- /icons/style/down_arrow_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/down_arrow_disabled.png -------------------------------------------------------------------------------- /icons/style/golden-arrow-left-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/golden-arrow-left-up.png -------------------------------------------------------------------------------- /icons/style/header-close-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/header-close-button.png -------------------------------------------------------------------------------- /icons/style/messagebox-critical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/messagebox-critical.png -------------------------------------------------------------------------------- /icons/style/messagebox-question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/messagebox-question.png -------------------------------------------------------------------------------- /icons/style/radiobutton_checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_checked.png -------------------------------------------------------------------------------- /icons/style/toolbar-horiz-pixmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/toolbar-horiz-pixmap.png -------------------------------------------------------------------------------- /icons/style/toolbar-vert-pixmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/toolbar-vert-pixmap.png -------------------------------------------------------------------------------- /icons/style/arrow-up-small-inverted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-up-small-inverted.png -------------------------------------------------------------------------------- /icons/style/checkbox_checked_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/checkbox_checked_hover.png -------------------------------------------------------------------------------- /icons/style/checkbox_indeterminate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/checkbox_indeterminate.png -------------------------------------------------------------------------------- /icons/style/messagebox-information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/messagebox-information.png -------------------------------------------------------------------------------- /icons/style/radiobutton_unchecked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_unchecked.png -------------------------------------------------------------------------------- /icons/style/tab-scroll-button-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/tab-scroll-button-hover.png -------------------------------------------------------------------------------- /samples/README: -------------------------------------------------------------------------------- 1 | Samples from standard Hydrogen drum machine kits, except for piano.wav 2 | (ancestry unknown) and click.wav (random noise). 3 | -------------------------------------------------------------------------------- /icons/style/arrow-down-small-inverted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-down-small-inverted.png -------------------------------------------------------------------------------- /icons/style/arrow-left-small-inverted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-left-small-inverted.png -------------------------------------------------------------------------------- /icons/style/checkbox_checked_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/checkbox_checked_disabled.png -------------------------------------------------------------------------------- /icons/style/checkbox_checked_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/checkbox_checked_pressed.png -------------------------------------------------------------------------------- /icons/style/checkbox_unchecked_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/checkbox_unchecked_hover.png -------------------------------------------------------------------------------- /icons/style/radiobutton_checked_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_checked_hover.png -------------------------------------------------------------------------------- /icons/style/arrow-right-small-inverted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/arrow-right-small-inverted.png -------------------------------------------------------------------------------- /icons/style/checkbox_indeterminate_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/checkbox_indeterminate_hover.png -------------------------------------------------------------------------------- /icons/style/checkbox_unchecked_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/checkbox_unchecked_pressed.png -------------------------------------------------------------------------------- /icons/style/radiobutton_checked_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_checked_disabled.png -------------------------------------------------------------------------------- /icons/style/radiobutton_checked_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_checked_pressed.png -------------------------------------------------------------------------------- /icons/style/radiobutton_unchecked_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_unchecked_hover.png -------------------------------------------------------------------------------- /icons/style/tab-scroll-button-disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/tab-scroll-button-disabled.png -------------------------------------------------------------------------------- /icons/style/checkbox_indeterminate_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/checkbox_indeterminate_pressed.png -------------------------------------------------------------------------------- /icons/style/radiobutton_unchecked_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_unchecked_disabled.png -------------------------------------------------------------------------------- /icons/style/radiobutton_unchecked_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_unchecked_pressed.png -------------------------------------------------------------------------------- /icons/style/radiobutton_checked_hover_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_checked_hover_disabled.png -------------------------------------------------------------------------------- /icons/style/radiobutton_checked_pressed_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_checked_pressed_disabled.png -------------------------------------------------------------------------------- /icons/style/radiobutton_unchecked_hover_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_unchecked_hover_disabled.png -------------------------------------------------------------------------------- /icons/style/radiobutton_unchecked_pressed_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/icons/style/radiobutton_unchecked_pressed_disabled.png -------------------------------------------------------------------------------- /deploy/linux/deb-skeleton/usr/share/doc/sonic-lineup/changelog.Debian.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonic-visualiser/sonic-lineup/HEAD/deploy/linux/deb-skeleton/usr/share/doc/sonic-lineup/changelog.Debian.gz -------------------------------------------------------------------------------- /icons/README: -------------------------------------------------------------------------------- 1 | Icons are from various GPL'd sources, including the GIMP image editor, 2 | KDE crystalsvg icon set, Rosegarden audio and MIDI sequencer, and Hydrogen 3 | drum machine. Some modifications and new drawings by Chris Cannam. 4 | -------------------------------------------------------------------------------- /repoint.pri: -------------------------------------------------------------------------------- 1 | 2 | repoint.target = $$PWD/.repoint.point 3 | repoint.depends = $$PWD/repoint-project.json $$PWD/repoint-lock.json 4 | repoint.commands = $$PWD/repoint install --directory $$PWD 5 | 6 | QMAKE_EXTRA_TARGETS += repoint 7 | PRE_TARGETDEPS += $$repoint.target 8 | -------------------------------------------------------------------------------- /deploy/osx/Entitlements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | com.apple.security.app-sandbox 5 | 6 | com.apple.security.device.audio-input 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /pitch-track-align/Makefile: -------------------------------------------------------------------------------- 1 | 2 | SCRIPTS := ../../sml-buildscripts 3 | 4 | pitch-track-align: pitch-track-align.mlb pitch-track-align.deps 5 | mlton pitch-track-align.mlb 6 | 7 | pitch-track-align.deps: pitch-track-align.mlb 8 | ${SCRIPTS}/mlb-dependencies $^ > $@ 9 | 10 | clean: 11 | rm -f pitch-track-align *.deps 12 | 13 | -include *.deps 14 | -------------------------------------------------------------------------------- /pitch-track-align/note-track.ttl: -------------------------------------------------------------------------------- 1 | @prefix xsd: . 2 | @prefix vamp: . 3 | @prefix : <#> . 4 | 5 | :transform a vamp:Transform ; 6 | vamp:plugin ; 7 | vamp:output . 8 | -------------------------------------------------------------------------------- /deploy/win64/README-Vamp.txt: -------------------------------------------------------------------------------- 1 | 2 | To add 64-bit Vamp audio analysis plugins to the Transform menu in 3 | Sonic Visualiser, unpack and copy them into this directory. 4 | 5 | (For 32-bit plugins, put them in "C:\Program Files (x86)\Vamp Plugins" 6 | instead, or the equivalent in your local language edition of Windows.) 7 | 8 | See http://vamp-plugins.org/ for more information. 9 | -------------------------------------------------------------------------------- /os-other.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = lib 3 | 4 | exists(config.pri) { 5 | include(config.pri) 6 | } 7 | 8 | !exists(config.pri) { 9 | include(noconfig.pri) 10 | } 11 | 12 | CONFIG -= qt 13 | CONFIG += plugin no_plugin_name_prefix release warn_on 14 | 15 | TARGET = os_other 16 | 17 | OBJECTS_DIR = o 18 | 19 | win32-msvc* { 20 | LIBS += -EXPORT:OSReportsDarkThemeActive -EXPORT:OSQueryAccentColour 21 | } 22 | 23 | SOURCES += \ 24 | svcore/system/os-other.cpp 25 | 26 | -------------------------------------------------------------------------------- /sonic-lineup.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=Sonic Lineup 3 | Comment=Comparative visualisation of multiple audio files of related content 4 | Exec=sonic-lineup %U 5 | Keywords=audio; sound; visualiser; sonic; 6 | Terminal=false 7 | Type=Application 8 | Icon=sonic-lineup-icon 9 | Categories=Audio;AudioVideo; 10 | MimeType=application/x-ogg;audio/mp3;audio/ogg;audio/mpeg;audio/mpegurl;audio/x-flac;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-wav;audio/wav;application/ogg;audio/x-vorbis+ogg; 11 | -------------------------------------------------------------------------------- /deploy/linux/fix-lintian-bits.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | dir=$1 4 | 5 | [ -d "$dir" ] || exit 1 6 | 7 | set -eu 8 | 9 | strip "$dir"/usr/bin/* 10 | strip "$dir"/usr/lib/*/*.so 11 | strip "$dir"/usr/lib/*/vamp-plugin-load-checker 12 | 13 | sz=`du -sx --exclude DEBIAN "$dir" | awk '{ print $1; }'` 14 | perl -i -p -e "s/Installed-Size: .*/Installed-Size: $sz/" "$dir"/DEBIAN/control 15 | 16 | find "$dir" -name \*~ -exec rm \{\} \; 17 | 18 | chown -R root.root "$dir"/* 19 | 20 | chmod -R g-w "$dir"/* 21 | -------------------------------------------------------------------------------- /os-win10.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = lib 3 | 4 | exists(config.pri) { 5 | include(config.pri) 6 | } 7 | 8 | !exists(config.pri) { 9 | include(noconfig.pri) 10 | } 11 | 12 | CONFIG -= qt 13 | CONFIG += plugin no_plugin_name_prefix release warn_on 14 | 15 | TARGET = os 16 | 17 | OBJECTS_DIR = o 18 | 19 | win32-msvc* { 20 | LIBS += -EXPORT:OSReportsDarkThemeActive -EXPORT:OSQueryAccentColour 21 | LIBS += -lWindowsApp 22 | } 23 | 24 | SOURCES += \ 25 | svcore/system/os-win10.cpp 26 | 27 | -------------------------------------------------------------------------------- /pitch-track-align/pitch-track.ttl: -------------------------------------------------------------------------------- 1 | @prefix xsd: . 2 | @prefix vamp: . 3 | @prefix : <#> . 4 | 5 | :transform a vamp:Transform ; 6 | vamp:plugin ; 7 | vamp:parameter_binding [ 8 | vamp:parameter [ vamp:identifier "outputunvoiced" ] ; 9 | vamp:value "2"^^xsd:float ; 10 | ] ; 11 | vamp:output . 12 | -------------------------------------------------------------------------------- /deploy/linux/deb-skeleton/usr/share/applications/sonic-lineup.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=Sonic Lineup 3 | Comment=Comparative visualisation of multiple audio files of related content 4 | Exec=sonic-lineup %U 5 | Keywords=audio; sound; visualiser; sonic; 6 | Terminal=false 7 | Type=Application 8 | Icon=sonic-lineup-icon 9 | Categories=Audio;AudioVideo; 10 | MimeType=application/x-ogg;audio/mp3;audio/ogg;audio/mpeg;audio/mpegurl;audio/x-flac;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-wav;audio/wav;application/ogg;audio/x-vorbis+ogg; 11 | -------------------------------------------------------------------------------- /deploy/linux/docker/Dockerfile_test_deb.in: -------------------------------------------------------------------------------- 1 | FROM ubuntu:18.04 2 | 3 | # Ensure that everything subsequent is re-run when a new revision is 4 | # being built (rather than being cached) - so as to avoid potential 5 | # mismatches between results of apt-get update and the package 6 | # dependency installation itself 7 | RUN echo [[REVISION]] 8 | 9 | RUN apt-get update 10 | ADD output/sonic-lineup_[[RELEASE]]_amd64.deb sonic-lineup_[[RELEASE]]_amd64.deb 11 | RUN apt install -y ./sonic-lineup_[[RELEASE]]_amd64.deb 12 | RUN /usr/bin/sonic-lineup --version 13 | 14 | -------------------------------------------------------------------------------- /deploy/src/update-i18n.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | LUPDATE="lupdate" 4 | LRELEASE="lrelease" 5 | 6 | if lupdate-qt5 -version >/dev/null 2>&1; then 7 | LUPDATE="lupdate-qt5" 8 | LRELEASE="lrelease-qt5" 9 | fi 10 | 11 | LANGUAGES="ru en_GB en_US cs_CZ" 12 | 13 | for LANG in $LANGUAGES; do 14 | $LUPDATE \ 15 | svcore/*/*.h svcore/*/*.cpp \ 16 | svcore/*/*/*.h svcore/*/*/*.cpp \ 17 | svgui/*/*.h svgui/*/*.cpp \ 18 | svapp/*/*.h svapp/*/*.cpp \ 19 | */*.h */*.cpp \ 20 | -ts i18n/vect_$LANG.ts 21 | done 22 | 23 | for LANG in $LANGUAGES; do 24 | $LRELEASE i18n/vect_$LANG.ts 25 | done 26 | 27 | -------------------------------------------------------------------------------- /deploy/linux/docker/Dockerfile_test_appimage.in: -------------------------------------------------------------------------------- 1 | FROM centos:7 2 | 3 | # Ensure that everything subsequent is re-run when a new revision is 4 | # being built (rather than being cached) - so as to avoid potential 5 | # mismatches between results of yum update and the package dependency 6 | # installation itself 7 | RUN echo [[REVISION]] 8 | 9 | RUN yum -y update 10 | RUN yum -y groupinstall "X Window System" 11 | RUN yum -y install wget 12 | ADD output/SonicLineup-[[REVISION]]-x86_64.AppImage SL.AppImage 13 | RUN chmod +x SL.AppImage 14 | RUN ./SL.AppImage --appimage-extract 15 | RUN ./squashfs-root/AppRun --version 16 | -------------------------------------------------------------------------------- /config.pri.in: -------------------------------------------------------------------------------- 1 | 2 | CONFIG += @QMAKE_CONFIG@ 3 | 4 | PREFIX_PATH = @prefix@ 5 | 6 | DEFINES += @HAVES@ 7 | 8 | QMAKE_CC = @CC@ 9 | QMAKE_CXX = @CXX@ 10 | QMAKE_LINK = @CXX@ 11 | 12 | QMAKE_CFLAGS += @CFLAGS@ 13 | QMAKE_CXXFLAGS += @CXXFLAGS@ 14 | QMAKE_LFLAGS += @LDFLAGS@ 15 | 16 | CONFIG += @CXXSTANDARD@ 17 | 18 | linux*:LIBS += -L$$PWD -lbase -lasound -ldl 19 | 20 | macx*:DEFINES += HAVE_COREAUDIO 21 | macx*:LIBS += -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices 22 | 23 | LIBS += @LIBS@ 24 | 25 | linux*:LIBS -= -ljack 26 | 27 | DEFINES += HAVE_PIPER HAVE_PLUGIN_CHECKER_HELPER DYNAMIC_JACK 28 | 29 | -------------------------------------------------------------------------------- /deploy/clean-build-and-package.bat: -------------------------------------------------------------------------------- 1 | @rem Run this from within the top-level dir: deploy\clean-build-and-package 2 | @echo on 3 | 4 | @set /p VERSION= 4 | Architecture: amd64 5 | Version: 1.0cc-1 6 | Installed-Size: 6056 7 | Section: contrib/sound 8 | Depends: libqt5core5a, libsndfile1, libsamplerate0, libfftw3-3, libbz2-1.0, libpulse0, libmad0, libid3tag0, liboggz2, libfishsound1, libasound2, liblo7, liblrdf0, libsord-0-0, libserd-0-0, vamp-plugin-sdk, librubberband2, libc6 9 | Description: Comparative visualisation of related audio recordings 10 | Sonic Lineup is an application for quick read-only comparative 11 | visualisation of multiple audio files whose contents consist of 12 | different performances of the same work or recordings of the same 13 | material. 14 | -------------------------------------------------------------------------------- /test-svcore-data-fileio.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = app 3 | 4 | exists(config.pri) { 5 | include(config.pri) 6 | } 7 | 8 | !exists(config.pri) { 9 | include(noconfig.pri) 10 | } 11 | 12 | include(base.pri) 13 | 14 | CONFIG += console 15 | QT += network xml testlib 16 | QT -= gui 17 | 18 | win32-x-g++:QMAKE_LFLAGS += -Wl,-subsystem,console 19 | macx*: CONFIG -= app_bundle 20 | 21 | TARGET = test-svcore-data-fileio 22 | 23 | OBJECTS_DIR = o 24 | MOC_DIR = o 25 | 26 | include(svcore/data/fileio/test/files.pri) 27 | 28 | for (file, TEST_SOURCES) { SOURCES += $$sprintf("svcore/data/fileio/test/%1", $$file) } 29 | for (file, TEST_HEADERS) { HEADERS += $$sprintf("svcore/data/fileio/test/%1", $$file) } 30 | 31 | !win32* { 32 | QMAKE_POST_LINK = ./$${TARGET} 33 | } 34 | -------------------------------------------------------------------------------- /test-svcore-data-model.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = app 3 | 4 | exists(config.pri) { 5 | include(config.pri) 6 | } 7 | 8 | !exists(config.pri) { 9 | include(noconfig.pri) 10 | } 11 | 12 | include(base.pri) 13 | 14 | CONFIG += console 15 | QT += network xml testlib 16 | QT -= gui 17 | 18 | win32-x-g++:QMAKE_LFLAGS += -Wl,-subsystem,console 19 | macx*: CONFIG -= app_bundle 20 | 21 | TARGET = test-svcore-data-model 22 | 23 | OBJECTS_DIR = o 24 | MOC_DIR = o 25 | 26 | include(svcore/data/model/test/files.pri) 27 | 28 | for (file, TEST_SOURCES) { SOURCES += $$sprintf("svcore/data/model/test/%1", $$file) } 29 | for (file, TEST_HEADERS) { HEADERS += $$sprintf("svcore/data/model/test/%1", $$file) } 30 | 31 | !win32* { 32 | QMAKE_POST_LINK = ./$${TARGET} 33 | } 34 | 35 | -------------------------------------------------------------------------------- /deploy/linux/AppRun: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | mydir=$(dirname "$0") 4 | case "$mydir" in 5 | /*) ;; 6 | *) mydir="$PWD/$mydir";; 7 | esac 8 | 9 | echo "AppImage root is $mydir" 10 | 11 | PATH="$mydir/usr/bin:$mydir/bin:$PATH" 12 | export PATH 13 | 14 | LD_LIBRARY_PATH="$mydir/usr/lib:$mydir/usr/lib/x86_64-linux-gnu:$mydir/usr/lib64:$LD_LIBRARY_PATH" 15 | export LD_LIBRARY_PATH 16 | 17 | QT_PLUGIN_PATH="$mydir/usr/lib/qt5/plugins/:$mydir/usr/lib/x86_64-linux-gnu/qt5/plugins/:$mydir/usr/lib64/qt5/plugins/:$QT_PLUGIN_PATH" 18 | export QT_PLUGIN_PATH 19 | 20 | XDG_DATA_DIRS="$mydir/usr/share:$XDG_DATA_DIRS:/usr/local/share:/usr/share" 21 | export XDG_DATA_DIRS 22 | 23 | GSETTINGS_SCHEMA_DIR="$mydir/usr/share/glib-2.0/schemas:$GSETTINGS_SCHEMA_DIR" 24 | export GSETTINGS_SCHEMA_DIR 25 | 26 | exec "$mydir/usr/bin/sonic-lineup" "$@" 27 | -------------------------------------------------------------------------------- /main/IntroDialog.h: -------------------------------------------------------------------------------- 1 | /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 2 | 3 | /* 4 | Sonic Lineup 5 | Comparative visualisation and alignment of related audio recordings 6 | Centre for Digital Music, Queen Mary, University of London. 7 | 8 | This program is free software; you can redistribute it and/or 9 | modify it under the terms of the GNU General Public License as 10 | published by the Free Software Foundation; either version 2 of the 11 | License, or (at your option) any later version. See the file 12 | COPYING included with this distribution for more information. 13 | */ 14 | 15 | #ifndef INTRO_DIALOG_H 16 | #define INTRO_DIALOG_H 17 | 18 | class QWidget; 19 | 20 | class IntroDialog 21 | { 22 | public: 23 | static void show(QWidget *parent); 24 | }; 25 | 26 | #endif 27 | -------------------------------------------------------------------------------- /.appveyor.yml: -------------------------------------------------------------------------------- 1 | 2 | image: 3 | - Visual Studio 2019 4 | 5 | configuration: 6 | - Release 7 | 8 | install: 9 | - cinst --allow-empty-checksums smlnj 10 | - cinst hg 11 | - ps: '"[hostfingerprints]" | Out-File -Encoding "ASCII" -Append $env:USERPROFILE\mercurial.ini' 12 | - ps: '"code.soundsoftware.ac.uk = C7:27:7E:2C:1E:67:62:90:E9:8D:27:52:66:30:E6:FE:D4:2C:C5:30" | Out-File -Encoding "ASCII" -Append $env:USERPROFILE\mercurial.ini' 13 | - ps: '"[hostsecurity]" | Out-File -Encoding "ASCII" -Append $env:USERPROFILE\mercurial.ini' 14 | - ps: '"code.soundsoftware.ac.uk = code.soundsoftware.ac.uk:fingerprints=sha256:AF:67:D8:D6:D8:2F:28:FF:B9:1A:4D:CD:6A:93:25:EC:9E:47:9E:0E:E7:F1:FD:0B:97:B4:7C:D5:FA:2E:10:73" | Out-File -Encoding "ASCII" -Append $env:USERPROFILE\mercurial.ini' 15 | 16 | build_script: 17 | - deploy\win64\build-and-package.bat 18 | 19 | -------------------------------------------------------------------------------- /.hgtags: -------------------------------------------------------------------------------- 1 | 774bee68e2f6628f829f91d2dd3c48d06ab23a84 vect_v0.1 2 | 71af1eb6373616946febc5f665631822bb0acfb8 v0.3 3 | 58e6f7617ded27d8e2b4a8526426b1336706fd7d v1.0pre1 4 | ab524fe04e4bfcba514dbd9dfb19b4a2670ce8f9 v1.0pre2 5 | 12e6150693cf50a542294f30d98609f8af10864e v1.0 6 | 12e6150693cf50a542294f30d98609f8af10864e v1.0 7 | 6af644edd243d14bb66c7bf9b11b4f9217dfbeef v1.0 8 | 6af644edd243d14bb66c7bf9b11b4f9217dfbeef v1.0 9 | d91be8a0a8a24dcadfd9586b15a7558ba0238001 v1.0 10 | c98dd2134981737db7d53c64c374c3f8716a9fb9 v1.0.1 11 | db3c5c831ca025f2b9f8780d32a5a25f1ff8f3a8 v1.1pre2 12 | 1778edddeb0a7446ada7a191e6c5ce8062ca3be0 v1.1pre3 13 | caa3ccad1c38d5e0b7619d0a93448117dc12457b v1.1pre4 14 | 1039347779f6f3ecd4b11b4d1e14b557dbc78dd3 v1.1pre5 15 | faf7ca23e3edbc958f0bcfcdfa0aea1513bd4201 v1.1pre6 16 | e7d373cd97a24163711526a99cf4b09ecff7564d v1.1pre7 17 | 68f74e5042e5b24511de6ba4dbc8e20776cbe15b v1.1 18 | -------------------------------------------------------------------------------- /main/NetworkPermissionTester.h: -------------------------------------------------------------------------------- 1 | /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 2 | 3 | /* 4 | Sonic Lineup 5 | Comparative visualisation and alignment of related audio recordings 6 | Centre for Digital Music, Queen Mary, University of London. 7 | 8 | This program is free software; you can redistribute it and/or 9 | modify it under the terms of the GNU General Public License as 10 | published by the Free Software Foundation; either version 2 of the 11 | License, or (at your option) any later version. See the file 12 | COPYING included with this distribution for more information. 13 | */ 14 | 15 | #ifndef NETWORK_PERMISSION_TESTER_H 16 | #define NETWORK_PERMISSION_TESTER_H 17 | 18 | class NetworkPermissionTester 19 | { 20 | public: 21 | NetworkPermissionTester() { } 22 | bool havePermission(); 23 | }; 24 | 25 | #endif 26 | 27 | 28 | -------------------------------------------------------------------------------- /base.pri: -------------------------------------------------------------------------------- 1 | 2 | SV_INCLUDEPATH = \ 3 | . \ 4 | bqvec \ 5 | bqvec/bqvec \ 6 | bqfft \ 7 | bqresample \ 8 | bqaudioio \ 9 | bqaudioio/bqaudioio \ 10 | bqaudiostream \ 11 | bqaudiostream/bqaudiostream \ 12 | bqthingfactory \ 13 | piper-vamp-cpp \ 14 | checker \ 15 | checker/checker \ 16 | dataquay \ 17 | dataquay/dataquay \ 18 | svcore \ 19 | svcore/data \ 20 | svcore/plugin/api/alsa \ 21 | svgui \ 22 | svapp \ 23 | vamp-plugin-sdk 24 | 25 | DEPENDPATH += $$SV_INCLUDEPATH 26 | INCLUDEPATH += $$SV_INCLUDEPATH 27 | 28 | # Platform defines for RtMidi 29 | linux*: DEFINES += __LINUX_ALSASEQ__ __LINUX_ALSA__ 30 | macx*: DEFINES += __MACOSX_CORE__ 31 | win*: DEFINES += __WINDOWS_MM__ 32 | solaris*: DEFINES += __RTMIDI_DUMMY_ONLY__ 33 | 34 | DEFINES += QT_DEPRECATED_WARNINGS_SINCE=0x050A00 35 | 36 | # Defines for Dataquay 37 | DEFINES += USE_SORD 38 | 39 | CONFIG += qt thread warn_on stl rtti exceptions 40 | -------------------------------------------------------------------------------- /icons/measure1mask.xbm: -------------------------------------------------------------------------------- 1 | #define measure1mask_width 32 2 | #define measure1mask_height 32 3 | static unsigned char measure1mask_bits[] = { 4 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 6 | 0x00, 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf8, 0x01, 0x00, 7 | 0x00, 0xfc, 0x01, 0x00, 0x00, 0xde, 0x01, 0x00, 0x00, 0xcf, 0x01, 0x00, 8 | 0x80, 0xc7, 0x01, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 9 | 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 15 | -------------------------------------------------------------------------------- /icons/measure2mask.xbm: -------------------------------------------------------------------------------- 1 | #define measure2mask_width 32 2 | #define measure2mask_height 32 3 | static unsigned char measure2mask_bits[] = { 4 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 10 | 0x00, 0x00, 0xfc, 0x07, 0x00, 0x80, 0xe3, 0x01, 0x00, 0x80, 0xf3, 0x00, 11 | 0x00, 0x80, 0x7b, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x1f, 0x00, 12 | 0x00, 0x80, 0x0f, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0x03, 0x00, 13 | 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 15 | -------------------------------------------------------------------------------- /deploy/osx/sign.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eu 4 | 5 | # Execute this from the top-level directory of the project (the one 6 | # that contains the .app bundle). Supply the name of the .app bundle 7 | # as argument 8 | dir="$1" 9 | if [ -z "$dir" ] || [ ! -d "$dir" ]; then 10 | echo "Usage: $0 " 11 | echo "Where pkgdir is the directory containing .app" 12 | echo "All .app bundles in pkgdir will be signed" 13 | exit 2 14 | fi 15 | 16 | entitlements=deploy/osx/Entitlements.plist 17 | 18 | for app in "$dir"/*.app; do 19 | find "$app" -name \*.dylib -print | while read fr; do 20 | codesign -s "Developer ID Application: Chris Cannam" -fv --deep --options runtime "$fr" 21 | done 22 | codesign -s "Developer ID Application: Chris Cannam" -fv --deep --options runtime --entitlements "$entitlements" "$app/Contents/MacOS/Sonic Lineup" 23 | codesign -s "Developer ID Application: Chris Cannam" -fv --deep --options runtime --entitlements "$entitlements" "$app" 24 | done 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /azi.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = lib 3 | 4 | exists(config.pri) { 5 | include(config.pri) 6 | } 7 | 8 | !exists(config.pri) { 9 | include(noconfig.pri) 10 | } 11 | 12 | CONFIG -= qt 13 | CONFIG += plugin no_plugin_name_prefix release warn_on 14 | 15 | TARGET = azi 16 | 17 | OBJECTS_DIR = azi/o 18 | 19 | INCLUDEPATH += $$PWD/vamp-plugin-sdk 20 | 21 | QMAKE_CXXFLAGS -= -Werror 22 | 23 | win32-msvc* { 24 | LIBS += -EXPORT:vampGetPluginDescriptor 25 | } 26 | win32-g++* { 27 | LIBS += -Wl,--version-script=$$PWD/azi/vamp-plugin.map 28 | } 29 | linux* { 30 | LIBS += -Wl,--version-script=$$PWD/azi/vamp-plugin.map 31 | } 32 | macx* { 33 | LIBS += -exported_symbols_list $$PWD/azi/vamp-plugin.list 34 | } 35 | 36 | SOURCES += \ 37 | azi/Azi.cpp \ 38 | azi/plugins.cpp \ 39 | vamp-plugin-sdk/src/vamp-sdk/FFT.cpp \ 40 | vamp-plugin-sdk/src/vamp-sdk/PluginAdapter.cpp \ 41 | vamp-plugin-sdk/src/vamp-sdk/RealTime.cpp 42 | 43 | HEADERS += \ 44 | azi/Azi.h 45 | 46 | -------------------------------------------------------------------------------- /icons/measure1cursor.xbm: -------------------------------------------------------------------------------- 1 | #define measure1cursor_width 32 2 | #define measure1cursor_height 32 3 | #define measure1cursor_x_hot 15 4 | #define measure1cursor_y_hot 14 5 | static unsigned char measure1cursor_bits[] = { 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 8 | 0x00, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 9 | 0x00, 0x98, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 10 | 0x00, 0x83, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 17 | -------------------------------------------------------------------------------- /icons/measure2cursor.xbm: -------------------------------------------------------------------------------- 1 | #define measure2cursor_width 32 2 | #define measure2cursor_height 32 3 | #define measure2cursor_x_hot 16 4 | #define measure2cursor_y_hot 17 5 | static unsigned char measure2cursor_bits[] = { 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 12 | 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x61, 0x00, 13 | 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0f, 0x00, 14 | 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 15 | 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 17 | -------------------------------------------------------------------------------- /pitch-track-align/pitch-track-align.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | mydir=$(dirname "$0") 4 | 5 | set -eu 6 | 7 | file1="$1" 8 | file2="$2" 9 | 10 | export PATH=$PATH:"$mydir"/../../sonic-annotator 11 | 12 | tmproot=/tmp/pitch-track-align-"$$" 13 | trap "rm -f $tmproot.a $tmproot.b" 0 14 | 15 | #sonic-annotator -t "$mydir/pitch-track.ttl" "$file1" -w csv --csv-one-file "$tmproot.a" --csv-omit-filename --csv-force 16 | #sonic-annotator -t "$mydir/pitch-track.ttl" "$file2" -w csv --csv-one-file "$tmproot.b" --csv-omit-filename --csv-force 17 | 18 | sonic-annotator -t "$mydir/note-track.ttl" "$file1" -w csv --csv-omit-filename --csv-stdout | awk -F, '{ print $1 "," $3 }' > "$tmproot.a" 19 | sonic-annotator -t "$mydir/note-track.ttl" "$file2" -w csv --csv-omit-filename --csv-stdout | awk -F, '{ print $1 "," $3 }' > "$tmproot.b" 20 | 21 | echo 1>&2 22 | echo "First track:" 1>&2 23 | cat "$tmproot.a" 1>&2 24 | 25 | echo 1>&2 26 | echo "Second track:" 1>&2 27 | cat "$tmproot.b" 1>&2 28 | 29 | echo "0,0" 30 | 31 | "$mydir"/pitch-track-align "$tmproot.a" "$tmproot.b" 32 | 33 | -------------------------------------------------------------------------------- /deploy/linux/debian-dependencies.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | target=$1 4 | 5 | if [ ! -f "$target" ]; then 6 | echo "Usage: $0 target-executable" 7 | exit 1 8 | fi 9 | 10 | pfile=/tmp/packages_$$ 11 | rfile=/tmp/redundant_$$ 12 | 13 | trap "rm -f $pfile $rfile" 0 14 | echo 1>&2 15 | 16 | ldd "$target" | awk '{ print $3; }' | grep '^/' | while read lib; do 17 | if test -n "$lib" ; then 18 | dpkg-query -S "$lib" 19 | fi 20 | done | grep ': ' | awk -F: '{ print $1 }' | sort | uniq > $pfile 21 | 22 | echo "Packages providing required libraries:" 1>&2 23 | cat $pfile 1>&2 24 | echo 1>&2 25 | 26 | for p in `cat $pfile`; do 27 | echo Looking at $p 1>&2 28 | apt-cache showpkg "$p" | grep '^ ' | grep ',' | awk -F, '{ print $1; }' | \ 29 | while read d; do 30 | if grep -q '^'$d'$' $pfile; then 31 | echo $p 32 | fi 33 | done 34 | done | sort | uniq > $rfile 35 | 36 | echo "Packages that can be eliminated because other packages depend on them:" 1>&2 37 | cat $rfile 1>&2 38 | echo 1>&2 39 | 40 | cat $pfile $rfile | sort | uniq -u | sed 's/$/,/' | fmt -1000 | sed 's/^/Depends: /' | sed 's/,$/, libc6/' | sed 's/ libjack0,//' 41 | 42 | 43 | -------------------------------------------------------------------------------- /.hgignore: -------------------------------------------------------------------------------- 1 | syntax: glob 2 | Makefile 3 | Makefile.* 4 | */Makefile 5 | o/* 6 | */o/* 7 | */tmp_obj/* 8 | */tmp_moc/* 9 | doc/html/ 10 | *.o 11 | *.dylib 12 | *.so 13 | *.so.* 14 | *.a 15 | *.wav 16 | *~ 17 | *.orig 18 | *.rej 19 | re:^autom4te\.cache/ 20 | re:^qrc_.*\.cpp$ 21 | re:^vect$ 22 | re:^sonic-lineup$ 23 | re:^sonic-vector$ 24 | re:^aclocal\.m4$ 25 | re:^config\.log$ 26 | re:^config\.pri$ 27 | re:^config\.status$ 28 | *.app 29 | Sonic Lineup* 30 | .DS_Store 31 | *.stash 32 | cov-int/* 33 | *.deb 34 | test-svcore-base 35 | test-svcore-system 36 | test-svcore-data-fileio 37 | test-svcore-data-model 38 | vamp-plugin-sdk 39 | svcore 40 | svgui 41 | svapp 42 | checker 43 | piper 44 | piper-vamp-cpp 45 | dataquay 46 | bqvec 47 | bqfft 48 | bqresample 49 | bqaudioio 50 | sv-dependency-builds 51 | icons/scalable 52 | vamp-plugin-load-checker 53 | piper-vamp-simple-server 54 | piper-convert 55 | .repoint* 56 | build_win32 57 | build_win32_debug 58 | build_win64 59 | build_win64_debug 60 | constant-q-cpp 61 | Dockerfile*.gen 62 | qm-vamp-plugins 63 | ..* 64 | deploy/linux/docker/output 65 | *.AppImage 66 | packages/ 67 | pitch-track-align/pitch-track-align 68 | pitch-track-align/pitch-track-align.deps 69 | -------------------------------------------------------------------------------- /deploy/linux/deb-skeleton/usr/share/doc/sonic-lineup/copyright: -------------------------------------------------------------------------------- 1 | 2 | Sonic Lineup was developed at Queen Mary, University of London. 3 | Copyright 2005-2007 Chris Cannam and copyright 2006-2019 Queen Mary, 4 | University of London. 5 | 6 | Sonic Lineup incorporates a number of audio analysis plugins: 7 | 8 | * MATCH Audio Alignment Plugin, by Simon Dixon and Chris Cannam 9 | * NNLS Chroma and Chordino, by Matthias Mauch 10 | * pYIN Pitch Estimator, by Matthias Mauch 11 | * QM Key Estimator, by Katy Noland and Christian Landone 12 | 13 | If you make use of this software for any public or commercial purpose, 14 | we ask you to kindly mention the authors and Queen Mary, University of 15 | London in your user-visible documentation. We're very happy to see 16 | this sort of use but would much appreciate being credited, separately 17 | from the requirements of the software license itself (see below). 18 | 19 | This program is free software: you can redistribute it and/or modify 20 | it under the terms of the GNU General Public License as published by 21 | the Free Software Foundation, either version 2 of the License, or (at 22 | your option) any later version. See the file /usr/share/common-licenses/GPL-2 23 | for more information. 24 | 25 | -------------------------------------------------------------------------------- /vamp-plugin-sdk-files.pri: -------------------------------------------------------------------------------- 1 | 2 | VAMP_HEADERS += \ 3 | vamp-plugin-sdk/vamp-hostsdk/PluginBase.h \ 4 | vamp-plugin-sdk/vamp-hostsdk/PluginBufferingAdapter.h \ 5 | vamp-plugin-sdk/vamp-hostsdk/PluginChannelAdapter.h \ 6 | vamp-plugin-sdk/vamp-hostsdk/Plugin.h \ 7 | vamp-plugin-sdk/vamp-hostsdk/PluginHostAdapter.h \ 8 | vamp-plugin-sdk/vamp-hostsdk/PluginInputDomainAdapter.h \ 9 | vamp-plugin-sdk/vamp-hostsdk/PluginLoader.h \ 10 | vamp-plugin-sdk/vamp-hostsdk/PluginSummarisingAdapter.h \ 11 | vamp-plugin-sdk/vamp-hostsdk/PluginWrapper.h \ 12 | vamp-plugin-sdk/vamp-hostsdk/RealTime.h \ 13 | vamp-plugin-sdk/src/vamp-hostsdk/Window.h 14 | 15 | VAMP_SOURCES += \ 16 | vamp-plugin-sdk/src/vamp-hostsdk/PluginBufferingAdapter.cpp \ 17 | vamp-plugin-sdk/src/vamp-hostsdk/PluginChannelAdapter.cpp \ 18 | vamp-plugin-sdk/src/vamp-hostsdk/PluginHostAdapter.cpp \ 19 | vamp-plugin-sdk/src/vamp-hostsdk/PluginInputDomainAdapter.cpp \ 20 | vamp-plugin-sdk/src/vamp-hostsdk/PluginLoader.cpp \ 21 | vamp-plugin-sdk/src/vamp-hostsdk/PluginSummarisingAdapter.cpp \ 22 | vamp-plugin-sdk/src/vamp-hostsdk/PluginWrapper.cpp \ 23 | vamp-plugin-sdk/src/vamp-hostsdk/RealTime.cpp \ 24 | vamp-plugin-sdk/src/vamp-hostsdk/Files.cpp 25 | -------------------------------------------------------------------------------- /deploy/win64/generate-wxs.ps1: -------------------------------------------------------------------------------- 1 | 2 | Set-StrictMode -Version 2.0 3 | $ErrorActionPreference = "Stop" 4 | 5 | $redist_parent_dir = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Redist\MSVC\" 6 | 7 | $redists = (Get-ChildItem -Path $redist_parent_dir -Name -Include 14.* -Attributes Directory) 8 | 9 | if (!$redists) { 10 | echo "ERROR: No 14.x redistributable directories found under $redist_parent_dir" 11 | exit 1 12 | } 13 | 14 | $redist_ver = $redists[-1] 15 | 16 | $version = (Get-Content version.h) -replace '#define VECT_VERSION ','' -replace '"','' -replace '-pre.*','' 17 | $wxs = "deploy\win64\sonic-lineup.wxs" 18 | 19 | $in = "$wxs.in" 20 | 21 | $redist_dir="$redist_parent_dir\$redist_ver\x64\Microsoft.VC142.CRT" 22 | 23 | echo "Generating $wxs..." 24 | echo " ...for Sonic Lineup version $version" 25 | echo " ...for redist version $redist_ver" 26 | echo " ...from $in" 27 | echo "" 28 | 29 | if (!(Test-Path -Path $redist_dir -PathType Container)) { 30 | echo "ERROR: Redistributable directory $redist_dir not found" 31 | exit 1 32 | } 33 | 34 | if (!(Test-Path -Path $in -PathType Leaf)) { 35 | echo "ERROR: Input file $in not found" 36 | exit 1 37 | } 38 | 39 | (Get-Content $in) -replace '@VERSION@', $version -replace '@REDIST_VER@', $redist_ver -replace '@W@', '' | Out-File -encoding ASCII $wxs 40 | 41 | echo "Done" 42 | -------------------------------------------------------------------------------- /main/SmallSession.h: -------------------------------------------------------------------------------- 1 | /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 2 | 3 | /* 4 | Sonic Lineup 5 | Comparative visualisation and alignment of related audio recordings 6 | Centre for Digital Music, Queen Mary, University of London. 7 | 8 | This program is free software; you can redistribute it and/or 9 | modify it under the terms of the GNU General Public License as 10 | published by the Free Software Foundation; either version 2 of the 11 | License, or (at your option) any later version. See the file 12 | COPYING included with this distribution for more information. 13 | */ 14 | 15 | #ifndef VECT_SMALL_SESSION_H 16 | #define VECT_SMALL_SESSION_H 17 | 18 | #include 19 | #include 20 | 21 | /** 22 | * Just a container for the origin URIs of the files in a session, 23 | * with load/save from/to XML. 24 | */ 25 | struct SmallSession 26 | { 27 | QString mainFile; 28 | std::vector additionalFiles; 29 | 30 | /** 31 | * Save the given session to the given filename. 32 | * Throw std::runtime_error if the save fails. 33 | */ 34 | static void save(const SmallSession &session, QString toSmallSessionFile); 35 | 36 | /** 37 | * Load a session from the given session file. 38 | * Throw std::runtime_error if the load fails. 39 | */ 40 | static SmallSession load(QString fromSmallSessionFile); 41 | }; 42 | 43 | #endif 44 | 45 | -------------------------------------------------------------------------------- /convert.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = app 3 | 4 | CONFIG += stl exceptions console warn_on 5 | CONFIG -= qt 6 | 7 | exists(config.pri) { 8 | include(config.pri) 9 | } 10 | 11 | !exists(config.pri) { 12 | include(noconfig.pri) 13 | 14 | macx*: LIBS -= -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices -framework Accelerate -lbz2 -lz 15 | } 16 | 17 | # Can't support this flag with the JSON11 and basen modules as they stand 18 | QMAKE_CXXFLAGS -= -Werror 19 | 20 | # Using the "console" CONFIG flag above should ensure this happens for 21 | # normal Windows builds, but this may be necessary when cross-compiling 22 | win32-x-g++: QMAKE_LFLAGS += -Wl,-subsystem,console 23 | 24 | macx*: CONFIG -= app_bundle 25 | 26 | linux*: LIBS += -ldl 27 | 28 | TARGET = piper-convert 29 | 30 | OBJECTS_DIR = o 31 | MOC_DIR = o 32 | 33 | INCLUDEPATH += piper-vamp-cpp piper-vamp-cpp/ext vamp-plugin-sdk 34 | 35 | include(vamp-plugin-sdk-files.pri) 36 | 37 | for (file, VAMP_SOURCES) { SOURCES += $$file } 38 | for (file, VAMP_HEADERS) { HEADERS += $$file } 39 | 40 | HEADERS += \ 41 | piper-vamp-cpp/vamp-capnp/piper.capnp.h \ 42 | piper-vamp-cpp/vamp-capnp/VampnProto.h 43 | 44 | SOURCES += \ 45 | piper-vamp-cpp/vamp-capnp/piper-capnp.cpp \ 46 | piper-vamp-cpp/ext/json11/json11.cpp \ 47 | piper-vamp-cpp/vamp-server/convert.cpp 48 | -------------------------------------------------------------------------------- /server.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = app 3 | 4 | CONFIG += stl exceptions console warn_on 5 | CONFIG -= qt 6 | 7 | exists(config.pri) { 8 | include(config.pri) 9 | } 10 | 11 | !exists(config.pri) { 12 | include(noconfig.pri) 13 | 14 | macx*: LIBS -= -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices -framework Accelerate -lbz2 -lz 15 | } 16 | 17 | # Can't support this flag with the JSON11 and basen modules as they stand 18 | QMAKE_CXXFLAGS -= -Werror 19 | 20 | # Using the "console" CONFIG flag above should ensure this happens for 21 | # normal Windows builds, but this may be necessary when cross-compiling 22 | win32-x-g++: QMAKE_LFLAGS += -Wl,-subsystem,console 23 | 24 | macx*: CONFIG -= app_bundle 25 | 26 | linux*: LIBS += -ldl 27 | 28 | TARGET = piper-vamp-simple-server 29 | 30 | OBJECTS_DIR = o 31 | MOC_DIR = o 32 | 33 | INCLUDEPATH += piper-vamp-cpp piper-vamp-cpp/ext vamp-plugin-sdk 34 | 35 | include(vamp-plugin-sdk-files.pri) 36 | 37 | for (file, VAMP_SOURCES) { SOURCES += $$file } 38 | for (file, VAMP_HEADERS) { HEADERS += $$file } 39 | 40 | HEADERS += \ 41 | piper-vamp-cpp/vamp-capnp/piper.capnp.h \ 42 | piper-vamp-cpp/vamp-capnp/VampnProto.h 43 | 44 | SOURCES += \ 45 | piper-vamp-cpp/vamp-capnp/piper-capnp.cpp \ 46 | piper-vamp-cpp/ext/json11/json11.cpp \ 47 | piper-vamp-cpp/vamp-server/simple-server.cpp 48 | -------------------------------------------------------------------------------- /nnls-chroma.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = lib 3 | 4 | exists(config.pri) { 5 | include(config.pri) 6 | } 7 | 8 | !exists(config.pri) { 9 | include(noconfig.pri) 10 | } 11 | 12 | CONFIG -= qt 13 | CONFIG += plugin no_plugin_name_prefix release warn_on 14 | 15 | TARGET = nnls-chroma 16 | 17 | OBJECTS_DIR = nnls-chroma/o 18 | 19 | INCLUDEPATH += $$PWD/vamp-plugin-sdk 20 | 21 | QMAKE_CXXFLAGS -= -Werror 22 | 23 | win32-msvc* { 24 | LIBS += -EXPORT:vampGetPluginDescriptor 25 | } 26 | win32-g++* { 27 | LIBS += -Wl,--version-script=$$PWD/nnls-chroma/vamp-plugin.map 28 | } 29 | linux* { 30 | LIBS += -Wl,--version-script=$$PWD/nnls-chroma/vamp-plugin.map 31 | } 32 | macx* { 33 | LIBS += -exported_symbols_list $$PWD/nnls-chroma/vamp-plugin.list 34 | } 35 | 36 | SOURCES += \ 37 | nnls-chroma/chromamethods.cpp \ 38 | nnls-chroma/NNLSBase.cpp \ 39 | nnls-chroma/NNLSChroma.cpp \ 40 | nnls-chroma/Chordino.cpp \ 41 | nnls-chroma/Tuning.cpp \ 42 | nnls-chroma/plugins.cpp \ 43 | nnls-chroma/nnls.c \ 44 | nnls-chroma/viterbi.cpp \ 45 | vamp-plugin-sdk/src/vamp-sdk/FFT.cpp \ 46 | vamp-plugin-sdk/src/vamp-sdk/PluginAdapter.cpp \ 47 | vamp-plugin-sdk/src/vamp-sdk/RealTime.cpp 48 | 49 | HEADERS += \ 50 | nnls-chroma/chromamethods.h \ 51 | nnls-chroma/NNLSBase.h \ 52 | nnls-chroma/NNLSChroma.h \ 53 | nnls-chroma/Chordino.h \ 54 | nnls-chroma/Tuning.h \ 55 | nnls-chroma/nnls.h \ 56 | nnls-chroma/viterbi.h 57 | 58 | -------------------------------------------------------------------------------- /deploy/linux/build-and-test-appimage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Docker required 4 | 5 | set -eu 6 | 7 | current=$(hg id | awk '{ print $1; }') 8 | 9 | case "$current" in 10 | *+) echo "ERROR: Current working copy has been modified - unmodified copy required so we know we can check it out separately and obtain the same contents"; exit 2;; 11 | *);; 12 | esac 13 | 14 | echo 15 | echo "Building appimage from revision $current..." 16 | 17 | dockerdir=deploy/linux/docker 18 | 19 | cat "$dockerdir"/Dockerfile_appimage.in | \ 20 | perl -p -e "s/\[\[REVISION\]\]/$current/g" > \ 21 | "$dockerdir"/Dockerfile_appimage.gen 22 | 23 | cat "$dockerdir"/Dockerfile_test_appimage.in | \ 24 | perl -p -e "s/\[\[REVISION\]\]/$current/g" > \ 25 | "$dockerdir"/Dockerfile_test_appimage.gen 26 | 27 | fgrep 'hg.sr.ht' ~/.ssh/known_hosts > "$dockerdir"/known_hosts 28 | cp ~/.ssh/id_rsa_build "$dockerdir"/id_rsa_build 29 | chmod 600 "$dockerdir"/known_hosts "$dockerdir"/id_rsa_build 30 | trap "rm $dockerdir/known_hosts $dockerdir/id_rsa_build" 0 31 | 32 | dockertag="cannam/sonic-lineup-appimage-$current" 33 | 34 | sudo docker build -t "$dockertag" -f "$dockerdir"/Dockerfile_appimage.gen "$dockerdir" 35 | 36 | outdir="$dockerdir/output" 37 | mkdir -p "$outdir" 38 | 39 | container=$(sudo docker create "$dockertag") 40 | 41 | sudo docker cp "$container":output-appimage.tar "$outdir" 42 | sudo docker rm "$container" 43 | 44 | ( cd "$outdir" ; tar xf output-appimage.tar && rm -f output-appimage.tar ) 45 | 46 | sudo docker build -f "$dockerdir"/Dockerfile_test_appimage.gen "$dockerdir" 47 | -------------------------------------------------------------------------------- /pyin.pro: -------------------------------------------------------------------------------- 1 | TEMPLATE = lib 2 | 3 | exists(config.pri) { 4 | include(config.pri) 5 | } 6 | 7 | !exists(config.pri) { 8 | include(noconfig.pri) 9 | } 10 | 11 | CONFIG -= qt 12 | CONFIG += plugin no_plugin_name_prefix release warn_on 13 | 14 | TARGET = pyin 15 | 16 | OBJECTS_DIR = pyin/o 17 | 18 | INCLUDEPATH += $$PWD/vamp-plugin-sdk 19 | 20 | QMAKE_CXXFLAGS -= -Werror 21 | 22 | win32-msvc* { 23 | LIBS += -EXPORT:vampGetPluginDescriptor 24 | } 25 | win32-g++* { 26 | LIBS += -Wl,--version-script=$$PWD/pyin/vamp-plugin.map 27 | } 28 | linux* { 29 | LIBS += -Wl,--version-script=$$PWD/pyin/vamp-plugin.map 30 | } 31 | macx* { 32 | LIBS += -exported_symbols_list $$PWD/pyin/vamp-plugin.list 33 | } 34 | 35 | SOURCES += \ 36 | pyin/YinUtil.cpp \ 37 | pyin/Yin.cpp \ 38 | pyin/SparseHMM.cpp \ 39 | pyin/MonoPitchHMM.cpp \ 40 | pyin/MonoNoteParameters.cpp \ 41 | pyin/MonoNoteHMM.cpp \ 42 | pyin/MonoNote.cpp \ 43 | pyin/libmain.cpp \ 44 | pyin/YinVamp.cpp \ 45 | pyin/PYinVamp.cpp \ 46 | pyin/LocalCandidatePYIN.cpp \ 47 | vamp-plugin-sdk/src/vamp-sdk/FFT.cpp \ 48 | vamp-plugin-sdk/src/vamp-sdk/PluginAdapter.cpp \ 49 | vamp-plugin-sdk/src/vamp-sdk/RealTime.cpp 50 | 51 | HEADERS += \ 52 | pyin/YinUtil.h \ 53 | pyin/Yin.h \ 54 | pyin/SparseHMM.h \ 55 | pyin/MonoPitchHMM.h \ 56 | pyin/MonoNoteParameters.h \ 57 | pyin/MonoNoteHMM.h \ 58 | pyin/MonoNote.h \ 59 | pyin/MeanFilter.h \ 60 | pyin/YinVamp.h \ 61 | pyin/PYinVamp.h \ 62 | pyin/LocalCandidatePYIN.h 63 | 64 | -------------------------------------------------------------------------------- /sonic-lineup.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = subdirs 3 | 4 | SUBDIRS += \ 5 | sub_base 6 | 7 | win32-msvc* { 8 | SUBDIRS += \ 9 | sub_os_other \ 10 | sub_os_win10 11 | } 12 | 13 | # We build the tests on every platform, though at the time of 14 | # writing they are only automatically run on non-Windows platforms 15 | # (because of the difficulty of getting them running nicely in the 16 | # IDE without causing great confusion if a test fails). 17 | SUBDIRS += \ 18 | sub_test_svcore_base \ 19 | sub_test_svcore_system \ 20 | sub_test_svcore_data_fileio \ 21 | sub_test_svcore_data_model 22 | 23 | SUBDIRS += \ 24 | checker \ 25 | sub_server \ 26 | sub_convert \ 27 | sub_match \ 28 | sub_tuning_difference \ 29 | sub_pyin \ 30 | sub_nnls_chroma \ 31 | sub_qm_vamp_plugins \ 32 | sub_azi \ 33 | sub_vect 34 | 35 | sub_base.file = base.pro 36 | 37 | sub_os_other.file = os-other.pro 38 | sub_os_win10.file = os-win10.pro 39 | 40 | sub_test_svcore_base.file = test-svcore-base.pro 41 | sub_test_svcore_system.file = test-svcore-system.pro 42 | sub_test_svcore_data_fileio.file = test-svcore-data-fileio.pro 43 | sub_test_svcore_data_model.file = test-svcore-data-model.pro 44 | 45 | sub_server.file = server.pro 46 | sub_convert.file = convert.pro 47 | sub_match.file = match.pro 48 | sub_pyin.file = pyin.pro 49 | sub_tuning_difference.file = tuning-difference.pro 50 | sub_nnls_chroma.file = nnls-chroma.pro 51 | sub_qm_vamp_plugins.file = qm-vamp-plugins.pro 52 | sub_azi.file = azi.pro 53 | sub_vect.file = vectapp.pro 54 | 55 | CONFIG += ordered 56 | -------------------------------------------------------------------------------- /deploy/osx/copy-qt.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eu 4 | 5 | app="$1" 6 | if [ -z "$app" ]; then 7 | echo "Usage: $0 " 8 | echo "Provide appname without the .app extension, please" 9 | exit 2 10 | fi 11 | 12 | frameworks="QtCore QtNetwork QtGui QtXml QtSvg QtWidgets QtPrintSupport QtDBus" 13 | 14 | plugins="gif icns ico jpeg tga tiff wbmp webp cocoa minimal offscreen macstyle" 15 | 16 | qtdir=$(grep "Command:" Makefile | head -1 | awk '{ print $3; }' | sed s,/bin/.*,,) 17 | 18 | if [ ! -d "$qtdir" ]; then 19 | echo "Failed to discover Qt installation directory from Makefile, exiting" 20 | exit 2 21 | fi 22 | 23 | fdir="$app.app/Contents/Frameworks" 24 | pdir="$app.app/Contents/plugins" 25 | 26 | mkdir -p "$fdir" 27 | mkdir -p "$pdir" 28 | 29 | echo 30 | echo "Copying frameworks..." 31 | for fwk in $frameworks; do 32 | if [ ! -d "$qtdir/lib/$fwk.framework" ]; then 33 | if [ "$fwk" = "QtDBus" ]; then 34 | echo "QtDBus.framework not found, assuming Qt was built without DBus support" 35 | continue 36 | fi 37 | fi 38 | cp -v "$qtdir/lib/$fwk.framework/$fwk" "$fdir" || exit 2 39 | done 40 | 41 | echo "Done" 42 | 43 | echo 44 | echo "Copying plugins..." 45 | for plug in $plugins; do 46 | pfile=$(ls "$qtdir"/plugins/*/libq"$plug".dylib) 47 | if [ ! -f "$pfile" ]; then 48 | echo "Failed to find plugin $plug, exiting" 49 | exit 2 50 | fi 51 | target="$pdir"/${pfile##?*plugins/} 52 | tdir=`dirname "$target"` 53 | mkdir -p "$tdir" 54 | cp -v "$pfile" "$target" || exit 2 55 | done 56 | 57 | # Sometimes the copied-in files are read-only: correct that 58 | chmod -R u+w "$app.app" 59 | 60 | echo "Done" 61 | 62 | 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | Sonic Lineup 3 | ============ 4 | 5 | #### An application for comparative visualisation and alignment of related audio recordings 6 | 7 | Sonic Lineup is an application for quick read-only comparative 8 | visualisation of multiple audio files whose contents consist of 9 | different performances of the same work or recordings of the same 10 | material. 11 | 12 | For more information, please see http://www.sonicvisualiser.org/sonic-lineup/. 13 | 14 | 15 | Credits 16 | ------- 17 | 18 | Sonic Lineup was developed at the Centre for Digital Music, 19 | Queen Mary, University of London. 20 | 21 | http://c4dm.eecs.qmul.ac.uk/ 22 | 23 | Sonic Lineup was written by Chris Cannam, copyright 2005-2007 Chris 24 | Cannam and copyright 2006-2019 Queen Mary, University of London, 25 | except where indicated in the individual source files. 26 | 27 | Sonic Lineup incorporates a number of audio analysis plugins: 28 | 29 | * MATCH Audio Alignment Plugin, by Simon Dixon and Chris Cannam 30 | * NNLS Chroma and Chordino, by Matthias Mauch 31 | * pYIN Pitch Estimator, by Matthias Mauch 32 | * QM Key Estimator, by Katy Noland and Christian Landone 33 | 34 | Distributed under the GNU General Public License. See the file COPYING 35 | for details. 36 | 37 | 38 | Automated build reports 39 | ----------------------- 40 | 41 | * Linux and macOS CI build: [![Build Status](https://travis-ci.org/sonic-visualiser/sonic-lineup.svg?branch=default)](https://travis-ci.org/sonic-visualiser/sonic-lineup) 42 | * Windows CI build: [![Build status](https://ci.appveyor.com/api/projects/status/4r68mde0dlqk4sa5?svg=true)](https://ci.appveyor.com/project/cannam/sonic-lineup) 43 | -------------------------------------------------------------------------------- /deploy/src/archive.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eu 4 | 5 | tag=`hg tags | grep '^v' | head -1 | awk '{ print $1; }'` 6 | 7 | v=`echo "$tag" | sed 's/v//' | sed 's/_.*$//'` 8 | 9 | echo -n "Package up source code for version $v from tag $tag [Yn] ? " 10 | read yn 11 | case "$yn" in "") ;; [Yy]) ;; *) exit 3;; esac 12 | echo "Proceeding" 13 | 14 | current=$(hg id | awk '{ print $1; }') 15 | 16 | case "$current" in 17 | *+) echo "ERROR: Current working copy has been modified - unmodified copy required so we can update to tag and back again safely"; exit 2;; 18 | *);; 19 | esac 20 | 21 | echo 22 | echo -n "Packaging up version $v from tag $tag... " 23 | 24 | hg update -r"$tag" 25 | 26 | ./repoint archive "$(pwd)"/packages/sonic-lineup-"$v".tar.gz \ 27 | --exclude \ 28 | sv-dependency-builds \ 29 | repoint.pri \ 30 | vamp-plugin-sdk/test \ 31 | pyin/testdata \ 32 | qm-vamp-plugins/build \ 33 | qm-vamp-plugins/test \ 34 | constant-q-cpp/test 35 | 36 | hg update -r"$current" 37 | 38 | echo Done 39 | echo 40 | 41 | # Test that the appropriate version of the docs exist on the website 42 | 43 | doc_url="http://sonicvisualiser.org/sonic-lineup/doc/reference/$v/en/" 44 | doc_status=$(curl -sL -w "%{http_code}" "$doc_url" -o /dev/null) 45 | 46 | if [ "$doc_status" = "404" ]; then 47 | echo "*** WARNING: Documentation URL returns a 404:" 48 | echo "*** $doc_url" 49 | echo "*** Please fix this before release!" 50 | echo "*** And remember to update the link from" 51 | echo " http://www.sonicvisualiser.org/sonic-lineup/index.html !" 52 | echo 53 | fi 54 | -------------------------------------------------------------------------------- /deploy/linux/build-and-test-deb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Docker required 4 | 5 | set -eu 6 | 7 | current=$(hg id | awk '{ print $1; }') 8 | release=$(perl -p -e 's/^[^"]*"([^"]*)".*$/$1/' version.h) 9 | 10 | case "$current" in 11 | *+) echo "ERROR: Current working copy has been modified - unmodified copy required so we know we can check it out separately and obtain the same contents"; exit 2;; 12 | *);; 13 | esac 14 | 15 | echo 16 | echo "Building Debian deb archive from revision $current..." 17 | 18 | dockerdir=deploy/linux/docker 19 | 20 | cat "$dockerdir"/Dockerfile_deb.in | \ 21 | perl -p -e "s/\[\[REVISION\]\]/$current/g" | \ 22 | perl -p -e "s/\[\[RELEASE\]\]/$release/g" > \ 23 | "$dockerdir"/Dockerfile_deb.gen 24 | 25 | cat "$dockerdir"/Dockerfile_test_deb.in | \ 26 | perl -p -e "s/\[\[REVISION\]\]/$current/g" | \ 27 | perl -p -e "s/\[\[RELEASE\]\]/$release/g" > \ 28 | "$dockerdir"/Dockerfile_test_deb.gen 29 | 30 | fgrep 'hg.sr.ht' ~/.ssh/known_hosts > "$dockerdir"/known_hosts 31 | cp ~/.ssh/id_rsa_build "$dockerdir"/id_rsa_build 32 | chmod 600 "$dockerdir"/known_hosts "$dockerdir"/id_rsa_build 33 | trap "rm $dockerdir/known_hosts $dockerdir/id_rsa_build" 0 34 | 35 | dockertag="cannam/sonic-lineup-deb-$current" 36 | 37 | sudo docker build -t "$dockertag" -f "$dockerdir"/Dockerfile_deb.gen "$dockerdir" 38 | 39 | outdir="$dockerdir/output" 40 | mkdir -p "$outdir" 41 | 42 | container=$(sudo docker create "$dockertag") 43 | 44 | sudo docker cp "$container":output-deb.tar "$outdir" 45 | sudo docker rm "$container" 46 | 47 | ( cd "$outdir" ; tar xf output-deb.tar && rm -f output-deb.tar ) 48 | 49 | sudo docker build -f "$dockerdir"/Dockerfile_test_deb.gen "$dockerdir" 50 | -------------------------------------------------------------------------------- /repoint-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "libraries": { 3 | "vamp-plugin-sdk": { 4 | "pin": "0e32c328b02a" 5 | }, 6 | "svcore": { 7 | "pin": "f803d3c33f76" 8 | }, 9 | "svgui": { 10 | "pin": "dc0e47f234a2" 11 | }, 12 | "svapp": { 13 | "pin": "1089d65c585d" 14 | }, 15 | "checker": { 16 | "pin": "e839338d3869" 17 | }, 18 | "piper": { 19 | "pin": "3a742c556ac1f2bf9823f30b937c71c690e1f6ae" 20 | }, 21 | "piper-vamp-cpp": { 22 | "pin": "f0d3ab2952b21d287b481759bda986427df10ef7" 23 | }, 24 | "dataquay": { 25 | "pin": "35098262cadd" 26 | }, 27 | "bqvec": { 28 | "pin": "cd235ecbeb31" 29 | }, 30 | "bqfft": { 31 | "pin": "e1c392f85e97" 32 | }, 33 | "bqresample": { 34 | "pin": "c2fb51b31fe4" 35 | }, 36 | "bqaudioio": { 37 | "pin": "4fe94361597f" 38 | }, 39 | "bqaudiostream": { 40 | "pin": "a0926b93e771" 41 | }, 42 | "bqthingfactory": { 43 | "pin": "7686116dcdd5" 44 | }, 45 | "sv-dependency-builds": { 46 | "pin": "08ae793730bd" 47 | }, 48 | "icons/scalable": { 49 | "pin": "fd0ace21dce3" 50 | }, 51 | "match": { 52 | "pin": "aac9ad4064ea" 53 | }, 54 | "constant-q-cpp": { 55 | "pin": "7ac84048e3e43c433d88e12d221af15e50f41591" 56 | }, 57 | "tuning-difference": { 58 | "pin": "8fd1c994f937" 59 | }, 60 | "pyin": { 61 | "pin": "a7d9c6142f8f" 62 | }, 63 | "nnls-chroma": { 64 | "pin": "82d5d11b68d7" 65 | }, 66 | "qm-vamp-plugins": { 67 | "pin": "06933fecfa33aec41a07cc865098be7545ffcca3" 68 | }, 69 | "qm-vamp-plugins/lib/qm-dsp": { 70 | "pin": "e34a3cc188332ed7c33cd9257ef164de5b587191" 71 | }, 72 | "azi": { 73 | "pin": "299df1b44eff" 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: 2 | - cpp 3 | 4 | matrix: 5 | include: 6 | - os: osx 7 | osx_image: xcode11 8 | - os: linux 9 | dist: xenial 10 | sudo: required 11 | addons: 12 | apt: 13 | packages: 14 | - libbz2-dev libfftw3-dev libfishsound1-dev libid3tag0-dev liblo-dev liblrdf0-dev libmad0-dev liboggz2-dev libopus-dev libopusfile-dev libpulse-dev libsamplerate-dev libsndfile-dev libsord-dev libxml2-utils libboost-all-dev portaudio19-dev qt5-default libqt5svg5-dev raptor-utils librubberband-dev autoconf libtool git mlton 15 | 16 | before_install: 17 | - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then brew update ; fi 18 | - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then brew unlink python ; fi 19 | - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then brew install polyml ; fi 20 | - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then brew install qt5 ; fi 21 | - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then export PATH=$PATH:/usr/local/opt/qt5/bin ; fi 22 | - ( cd ../ ; git clone https://github.com/sandstorm-io/capnproto ) 23 | - ( cd ../capnproto/ ; git checkout v0.6.1 ) 24 | - ( cd ../capnproto/c++ ; autoreconf -i ) 25 | - ( cd ../capnproto/c++ ; ./configure && make && sudo make install ) 26 | 27 | before_script: 28 | - if [[ "$TRAVIS_OS_NAME" = "linux" ]] ; then ./configure ; else ./repoint install && qmake -r sonic-lineup.pro ; fi 29 | 30 | script: 31 | - make -j3 32 | - if [[ "$TRAVIS_OS_NAME" = "linux" ]] ; then sudo make install ; fi 33 | - if [[ "$TRAVIS_OS_NAME" = "linux" ]] ; then /usr/local/bin/sonic-lineup -v ; fi 34 | - if [[ "$TRAVIS_OS_NAME" = "linux" ]] ; then ( for p in azi match-vamp-plugin nnls-chroma pyin qm-vamp-plugins tuning-difference; do echo /usr/local/lib/sonic-lineup/$p.so ; done ) | /usr/local/lib/sonic-lineup/vamp-plugin-load-checker vampGetPluginDescriptor ; fi 35 | 36 | -------------------------------------------------------------------------------- /capnp-regen.pri: -------------------------------------------------------------------------------- 1 | 2 | capnpc.target = piper-vamp-cpp/vamp-capnp/piper.capnp.h 3 | capnpc.depends = $$PWD/piper/capnp/piper.capnp 4 | 5 | capnpc.commands = capnp compile --src-prefix=$$PWD/piper/capnp -oc++:$$PWD/piper-vamp-cpp/vamp-capnp $$capnpc.depends 6 | 7 | macx* { 8 | capnpc.commands=$$PWD/sv-dependency-builds/osx/bin/capnp -I$$PWD/sv-dependency-builds/osx/include compile --src-prefix=$$PWD/piper/capnp -o$$PWD/sv-dependency-builds/osx/bin/capnpc-c++:$$PWD/piper-vamp-cpp/vamp-capnp $$capnpc.depends 9 | } 10 | 11 | win32-g++ { 12 | capnpc.commands=$$PWD/sv-dependency-builds/win32-mingw/bin/capnp -I$$PWD/sv-dependency-builds/win32-mingw/include compile --src-prefix=$$PWD/piper/capnp -o$$PWD/sv-dependency-builds/win32-mingw/bin/capnpc-c++:$$PWD/piper-vamp-cpp/vamp-capnp $$capnpc.depends 13 | } 14 | 15 | win32-msvc* { 16 | # This config is actually for 64-bit Windows builds -- see 17 | # comments in noconfig.pri. 18 | 19 | # With MSVC2017 we have a problem that the header dependency is 20 | # written out with the relative path from the build dir to the 21 | # source dir (e.g. ..\sonic-visualiser\...) so if the header 22 | # target path doesn't match that, the build fails before 23 | # regenerating it. Not a problem with VC2015 for some reason. 24 | # I hope using the relative path as target should fix it without 25 | # breaking the VC2015 build. 26 | 27 | capnpc.target = ../$$basename(PWD)/piper-vamp-cpp/vamp-capnp/piper.capnp.h 28 | capnpc.commands=$$PWD/sv-dependency-builds/win64-msvc/bin/capnp -I$$PWD/sv-dependency-builds/win64-msvc/include compile --src-prefix=$$PWD/piper/capnp -o$$PWD/sv-dependency-builds/win64-msvc/bin/capnpc-c++:$$PWD/piper-vamp-cpp/vamp-capnp $$capnpc.depends 29 | } 30 | 31 | QMAKE_EXTRA_TARGETS += capnpc 32 | PRE_TARGETDEPS += $$capnpc.target 33 | QMAKE_CLEAN += $$capnpc.target 34 | 35 | -------------------------------------------------------------------------------- /bq-files.pri: -------------------------------------------------------------------------------- 1 | 2 | BQ_HEADERS += \ 3 | bqvec/bqvec/Allocators.h \ 4 | bqvec/bqvec/Barrier.h \ 5 | bqvec/bqvec/ComplexTypes.h \ 6 | bqvec/bqvec/Restrict.h \ 7 | bqvec/bqvec/RingBuffer.h \ 8 | bqvec/bqvec/VectorOpsComplex.h \ 9 | bqvec/bqvec/VectorOps.h \ 10 | bqvec/pommier/neon_mathfun.h \ 11 | bqvec/pommier/sse_mathfun.h \ 12 | bqfft/bqfft/FFT.h \ 13 | bqresample/bqresample/Resampler.h \ 14 | bqresample/speex/speex_resampler.h \ 15 | bqaudioio/bqaudioio/ApplicationPlaybackSource.h \ 16 | bqaudioio/bqaudioio/ApplicationRecordTarget.h \ 17 | bqaudioio/bqaudioio/AudioFactory.h \ 18 | bqaudioio/bqaudioio/ResamplerWrapper.h \ 19 | bqaudioio/bqaudioio/SystemAudioIO.h \ 20 | bqaudioio/bqaudioio/SystemPlaybackTarget.h \ 21 | bqaudioio/bqaudioio/SystemRecordSource.h \ 22 | bqaudioio/src/DynamicJACK.h \ 23 | bqaudioio/src/JACKAudioIO.h \ 24 | bqaudioio/src/Log.h \ 25 | bqaudioio/src/PortAudioIO.h \ 26 | bqaudioio/src/PulseAudioIO.h \ 27 | bqaudiostream/bqaudiostream/AudioReadStream.h \ 28 | bqaudiostream/bqaudiostream/AudioReadStreamFactory.h \ 29 | bqaudiostream/bqaudiostream/Exceptions.h \ 30 | bqthingfactory/bqthingfactory/ThingFactory.h 31 | 32 | BQ_SOURCES += \ 33 | bqvec/src/Allocators.cpp \ 34 | bqvec/src/Barrier.cpp \ 35 | bqvec/src/VectorOpsComplex.cpp \ 36 | bqfft/src/FFT.cpp \ 37 | bqresample/src/Resampler.cpp \ 38 | bqaudioio/src/AudioFactory.cpp \ 39 | bqaudioio/src/JACKAudioIO.cpp \ 40 | bqaudioio/src/Log.cpp \ 41 | bqaudioio/src/PortAudioIO.cpp \ 42 | bqaudioio/src/PulseAudioIO.cpp \ 43 | bqaudioio/src/ResamplerWrapper.cpp \ 44 | bqaudioio/src/SystemPlaybackTarget.cpp \ 45 | bqaudioio/src/SystemRecordSource.cpp \ 46 | bqaudiostream/src/AudioReadStream.cpp \ 47 | bqaudiostream/src/AudioReadStreamFactory.cpp \ 48 | bqaudiostream/src/AudioStreamExceptions.cpp 49 | 50 | -------------------------------------------------------------------------------- /base.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = lib 3 | 4 | exists(config.pri) { 5 | include(config.pri) 6 | } 7 | 8 | !exists(config.pri) { 9 | include(noconfig.pri) 10 | } 11 | 12 | include(base.pri) 13 | 14 | CONFIG += staticlib 15 | QT += network xml 16 | QT -= gui 17 | 18 | TARGET = base 19 | 20 | OBJECTS_DIR = o 21 | MOC_DIR = o 22 | 23 | exists(repoint.pri) { 24 | include(repoint.pri) 25 | } 26 | 27 | include(bq-files.pri) 28 | include(vamp-plugin-sdk-files.pri) 29 | include(svcore/files.pri) 30 | include(capnp-regen.pri) 31 | 32 | DATAQUAY_SOURCES=$$fromfile(dataquay/lib.pro, SOURCES) 33 | DATAQUAY_HEADERS=$$fromfile(dataquay/lib.pro, HEADERS) 34 | 35 | CHECKER_SOURCES=$$fromfile(checker/checker.pri, SOURCES) 36 | CHECKER_HEADERS=$$fromfile(checker/checker.pri, HEADERS) 37 | 38 | CLIENT_HEADERS=$$fromfile(piper-vamp-cpp/vamp-client/qt/test.pro, HEADERS) 39 | 40 | for (file, BQ_SOURCES) { SOURCES += $$file } 41 | for (file, BQ_HEADERS) { HEADERS += $$file } 42 | 43 | for (file, VAMP_SOURCES) { SOURCES += $$file } 44 | for (file, VAMP_HEADERS) { HEADERS += $$file } 45 | 46 | for (file, DATAQUAY_SOURCES) { SOURCES += $$sprintf("dataquay/%1", $$file) } 47 | for (file, DATAQUAY_HEADERS) { HEADERS += $$sprintf("dataquay/%1", $$file) } 48 | 49 | for (file, CHECKER_SOURCES) { SOURCES += $$sprintf("checker/%1", $$file) } 50 | for (file, CHECKER_HEADERS) { HEADERS += $$sprintf("checker/%1", $$file) } 51 | 52 | for (file, SVCORE_SOURCES) { SOURCES += $$sprintf("svcore/%1", $$file) } 53 | for (file, SVCORE_HEADERS) { HEADERS += $$sprintf("svcore/%1", $$file) } 54 | 55 | win32-msvc* { 56 | SOURCES -= svcore/system/os-other.cpp 57 | } 58 | 59 | for (file, CLIENT_HEADERS) { 60 | HEADERS += $$sprintf("piper-vamp-cpp/vamp-client/qt/%1", $$file) 61 | } 62 | 63 | SOURCES += piper-vamp-cpp/vamp-capnp/piper-capnp.cpp 64 | 65 | -------------------------------------------------------------------------------- /deploy/clean-build-and-package: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eu 4 | 5 | current=$(hg id | awk '{ print $1; }') 6 | 7 | case "$current" in 8 | *+) echo "ERROR: Current working copy has been modified - not proceeding";exit 2;; 9 | *);; 10 | esac 11 | 12 | version=`perl -p -e 's/^[^"]*"([^"]*)".*$/$1/' version.h` 13 | 14 | mkdir -p packages 15 | echo 16 | 17 | if [ -d /Applications ]; then 18 | 19 | if [ ! -f Makefile ]; then 20 | echo "You must have run a routine normal build at least once before this, so I can see which Qt settings to use" 21 | exit 1 22 | fi 23 | 24 | qmake=$(grep '^# Command: ' Makefile | awk '{ print $3; }') 25 | 26 | echo "Proceed to rebuild, package, and sign version $version using" 27 | echo -n "qmake path \"$qmake\" [Yn] ? " 28 | read yn 29 | case "$yn" in "") ;; [Yy]) ;; *) exit 3;; esac 30 | echo "Proceeding" 31 | 32 | app="Sonic Lineup" 33 | volume="$app"-"$version" 34 | dmg="$volume".dmg 35 | 36 | rm -rf "$app.app" 37 | rm -rf "$volume" 38 | rm -f "$dmg" 39 | 40 | ./repoint install 41 | 42 | rm -rf .qmake.stash 43 | "$qmake" -r 44 | make clean 45 | make -j3 46 | deploy/osx/deploy-and-package.sh 47 | 48 | mv "$dmg" packages/ 49 | 50 | else 51 | 52 | echo -n "Proceed to rebuild and package version $version [Yn] ? " 53 | read yn 54 | case "$yn" in "") ;; [Yy]) ;; *) exit 3;; esac 55 | echo "Proceeding" 56 | 57 | ./deploy/linux/build-and-test-appimage.sh 58 | 59 | squashedversion=$(echo "$version" | sed 's/_-//g') 60 | 61 | mv deploy/linux/docker/output/SonicLineup-"$current"-x86_64.AppImage \ 62 | packages/SonicLineup-"$squashedversion"-x86_64.AppImage 63 | 64 | ./deploy/linux/build-and-test-deb.sh 65 | 66 | mv deploy/linux/docker/output/sonic-lineup_"$version"_amd64.deb \ 67 | packages/ 68 | fi 69 | 70 | echo 71 | 72 | ls -l packages 73 | -------------------------------------------------------------------------------- /main/PreferencesDialog.h: -------------------------------------------------------------------------------- 1 | /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 2 | 3 | /* 4 | Sonic Lineup 5 | Comparative visualisation and alignment of related audio recordings 6 | Centre for Digital Music, Queen Mary, University of London. 7 | 8 | This program is free software; you can redistribute it and/or 9 | modify it under the terms of the GNU General Public License as 10 | published by the Free Software Foundation; either version 2 of the 11 | License, or (at your option) any later version. See the file 12 | COPYING included with this distribution for more information. 13 | */ 14 | 15 | #ifndef _PREFERENCES_DIALOG_H_ 16 | #define _PREFERENCES_DIALOG_H_ 17 | 18 | #include 19 | 20 | #include "base/Window.h" 21 | 22 | class WindowTypeSelector; 23 | class QPushButton; 24 | class QLineEdit; 25 | class QCheckBox; 26 | 27 | class PreferencesDialog : public QDialog 28 | { 29 | Q_OBJECT 30 | 31 | public: 32 | PreferencesDialog(QWidget *parent = 0); 33 | virtual ~PreferencesDialog(); 34 | 35 | public slots: 36 | void applicationClosing(bool quickly); 37 | 38 | protected slots: 39 | void tuningFrequencyChanged(double freq); 40 | 41 | void alignmentProgramToggleClicked(); 42 | void alignmentProgramButtonClicked(); 43 | void normaliseAudioToggleClicked(); 44 | 45 | void okClicked(); 46 | void applyClicked(); 47 | void cancelClicked(); 48 | 49 | protected: 50 | QPushButton *m_applyButton; 51 | 52 | QCheckBox *m_alignmentProgramToggle; 53 | QLineEdit *m_alignmentProgramEdit; 54 | QPushButton *m_alignmentProgramButton; 55 | QCheckBox *m_normaliseAudioToggle; 56 | 57 | double m_tuningFrequency; 58 | bool m_useAlignmentProgram; 59 | QString m_alignmentProgram; 60 | bool m_normaliseAudio; 61 | 62 | bool m_changesOnRestart; 63 | }; 64 | 65 | #endif 66 | -------------------------------------------------------------------------------- /tuning-difference.pro: -------------------------------------------------------------------------------- 1 | TEMPLATE = lib 2 | 3 | exists(config.pri) { 4 | include(config.pri) 5 | } 6 | 7 | !exists(config.pri) { 8 | include(noconfig.pri) 9 | } 10 | 11 | CONFIG -= qt 12 | CONFIG += plugin no_plugin_name_prefix release warn_on 13 | 14 | TARGET = tuning-difference 15 | 16 | OBJECTS_DIR = tuning-difference/o 17 | 18 | INCLUDEPATH += $$PWD/vamp-plugin-sdk $$PWD/constant-q-cpp $$PWD/constant-q-cpp/cq $$PWD/constant-q-cpp/src/ext/kissfft $$PWD/constant-q-cpp/src/ext/kissfft/tools 19 | 20 | QMAKE_CXXFLAGS -= -Werror 21 | 22 | DEFINES += kiss_fft_scalar=double 23 | 24 | win32-msvc* { 25 | LIBS += -EXPORT:vampGetPluginDescriptor 26 | } 27 | win32-g++* { 28 | LIBS += -Wl,--version-script=$$PWD/tuning-difference/vamp-plugin.map 29 | } 30 | linux* { 31 | LIBS += -Wl,--version-script=$$PWD/tuning-difference/vamp-plugin.map 32 | } 33 | macx* { 34 | LIBS += -exported_symbols_list $$PWD/tuning-difference/vamp-plugin.list 35 | } 36 | 37 | SOURCES += \ 38 | constant-q-cpp/src/CQKernel.cpp \ 39 | constant-q-cpp/src/ConstantQ.cpp \ 40 | constant-q-cpp/src/CQSpectrogram.cpp \ 41 | constant-q-cpp/src/CQInverse.cpp \ 42 | constant-q-cpp/src/Chromagram.cpp \ 43 | constant-q-cpp/src/Pitch.cpp \ 44 | constant-q-cpp/src/dsp/FFT.cpp \ 45 | constant-q-cpp/src/dsp/KaiserWindow.cpp \ 46 | constant-q-cpp/src/dsp/MathUtilities.cpp \ 47 | constant-q-cpp/src/dsp/Resampler.cpp \ 48 | constant-q-cpp/src/dsp/SincWindow.cpp \ 49 | constant-q-cpp/src/ext/kissfft/kiss_fft.c \ 50 | constant-q-cpp/src/ext/kissfft/tools/kiss_fftr.c \ 51 | tuning-difference/src/TuningDifference.cpp \ 52 | tuning-difference/src/plugins.cpp \ 53 | vamp-plugin-sdk/src/vamp-sdk/PluginAdapter.cpp \ 54 | vamp-plugin-sdk/src/vamp-sdk/RealTime.cpp 55 | 56 | HEADERS += \ 57 | tuning-difference/src/TuningDifference.h 58 | 59 | -------------------------------------------------------------------------------- /match.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = lib 3 | 4 | exists(config.pri) { 5 | include(config.pri) 6 | } 7 | 8 | !exists(config.pri) { 9 | include(noconfig.pri) 10 | } 11 | 12 | CONFIG -= qt 13 | CONFIG += plugin no_plugin_name_prefix release warn_on 14 | 15 | TARGET = match-vamp-plugin 16 | 17 | OBJECTS_DIR = match/o 18 | 19 | INCLUDEPATH += $$PWD/vamp-plugin-sdk 20 | 21 | QMAKE_CXXFLAGS -= -Werror 22 | 23 | DEFINES += USE_COMPACT_TYPES 24 | 25 | win32-msvc* { 26 | LIBS += -EXPORT:vampGetPluginDescriptor 27 | } 28 | win32-g++* { 29 | LIBS += -Wl,--version-script=$$PWD/match/vamp-plugin.map 30 | } 31 | linux* { 32 | LIBS += -Wl,--version-script=$$PWD/match/vamp-plugin.map 33 | } 34 | macx* { 35 | LIBS += -exported_symbols_list $$PWD/match/vamp-plugin.list 36 | } 37 | 38 | SOURCES += \ 39 | match/src/DistanceMetric.cpp \ 40 | match/src/FeatureConditioner.cpp \ 41 | match/src/FeatureExtractor.cpp \ 42 | match/src/Finder.cpp \ 43 | match/src/FullDTW.cpp \ 44 | match/src/Matcher.cpp \ 45 | match/src/MatchFeatureFeeder.cpp \ 46 | match/src/MatchPipeline.cpp \ 47 | match/src/MatchVampPlugin.cpp \ 48 | match/src/Path.cpp \ 49 | match/src/SubsequenceMatchVampPlugin.cpp \ 50 | match/src/libmain.cpp \ 51 | vamp-plugin-sdk/src/vamp-sdk/FFT.cpp \ 52 | vamp-plugin-sdk/src/vamp-sdk/PluginAdapter.cpp \ 53 | vamp-plugin-sdk/src/vamp-sdk/RealTime.cpp 54 | 55 | HEADERS += \ 56 | match/src/DistanceMetric.h \ 57 | match/src/FeatureConditioner.h \ 58 | match/src/FeatureExtractor.h \ 59 | match/src/Finder.h \ 60 | match/src/FullDTW.h \ 61 | match/src/Matcher.h \ 62 | match/src/MatchFeatureFeeder.h \ 63 | match/src/MatchPipeline.h \ 64 | match/src/MatchTypes.h \ 65 | match/src/MatchVampPlugin.h \ 66 | match/src/Path.h \ 67 | match/src/SubsequenceMatchVampPlugin.h 68 | 69 | 70 | -------------------------------------------------------------------------------- /deploy/osx/notarize.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ## The following assumes we have generated an app password at 4 | ## appleid.apple.com and then stored it to keychain id "altool" using 5 | ## e.g. 6 | ## security add-generic-password -a "cannam+apple@all-day-breakfast.com" \ 7 | ## -w "generated-app-password" -s "altool" 8 | 9 | ## NB to verify: 10 | # spctl -a -v "/Applications/Application.app" 11 | 12 | user="cannam+apple@all-day-breakfast.com" 13 | bundleid="org.sonicvisualiser.SonicLineup" 14 | 15 | set -e 16 | 17 | dmg="$1" 18 | 19 | if [ ! -f "$dmg" ] || [ -n "$2" ]; then 20 | echo "Usage: $0 " 21 | echo " e.g. $0 MyApplication-1.0.dmg" 22 | exit 2 23 | fi 24 | 25 | set -u 26 | 27 | echo 28 | echo "Uploading for notarization..." 29 | 30 | uuidfile=.notarization-uuid 31 | rm -f "$uuidfile" 32 | 33 | xcrun altool --notarize-app \ 34 | -f "$dmg" \ 35 | --primary-bundle-id "$bundleid" \ 36 | -u "$user" \ 37 | -p @keychain:altool 2>&1 | tee "$uuidfile" 38 | 39 | uuid=$(cat "$uuidfile" | grep RequestUUID | awk '{ print $3; }') 40 | 41 | if [ -z "$uuid" ]; then 42 | echo 43 | echo "Failed (no UUID returned, check output)" 44 | exit 1 45 | fi 46 | 47 | echo "Done, UUID is $uuid" 48 | 49 | echo 50 | echo "Waiting and checking for completion..." 51 | 52 | while true ; do 53 | sleep 30 54 | status=$(xcrun altool --notarization-info "$uuid" -u "$user" -p @keychain:altool 2>&1) 55 | if echo "$status" | grep -q 'Package Approved' ; then 56 | echo 57 | echo "Approved! Status output is:" 58 | echo "$status" 59 | break 60 | elif echo "$status" | grep -q 'in progress' ; then 61 | echo 62 | echo "Still in progress... Status output is:" 63 | echo "$status" 64 | echo "Waiting..." 65 | else 66 | echo 67 | echo "Failure or unknown status in output:" 68 | echo "$status" 69 | exit 2 70 | fi 71 | done 72 | 73 | echo 74 | echo "Stapling to package..." 75 | 76 | xcrun stapler staple "$dmg" || exit 1 77 | 78 | -------------------------------------------------------------------------------- /deploy/osx/paths.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | app="$1" 6 | if [ -z "$app" ]; then 7 | echo "Usage: $0 " 8 | echo "Provide appname without the .app extension, please" 9 | exit 2 10 | fi 11 | 12 | set -u 13 | 14 | frameworks="QtCore QtNetwork QtGui QtXml QtSvg QtWidgets QtPrintSupport QtDBus" 15 | 16 | echo 17 | echo "I expect you to have already copied these frameworks from the Qt installation to" 18 | echo "$app.app/Contents/Frameworks -- expect errors to follow if they're missing:" 19 | echo "$frameworks" 20 | echo 21 | 22 | echo "Fixing up loader paths in binaries..." 23 | 24 | for fwk in $frameworks; do 25 | install_name_tool -id $fwk "$app.app/Contents/Frameworks/$fwk" 26 | done 27 | 28 | find "$app.app" -name \*.dylib -print | while read x; do 29 | install_name_tool -id "`basename \"$x\"`" "$x" 30 | done 31 | 32 | for fwk in $frameworks; do 33 | find "$app.app" -type f -print | while read x; do 34 | if [ -x "$x" ]; then 35 | current=$(otool -L "$x" | grep "$fwk" | grep amework | grep -v ':$' | awk '{ print $1; }') 36 | [ -z "$current" ] && continue 37 | echo "$x has $current" 38 | relative=$(echo "$x" | sed -e "s,$app.app/Contents/,," \ 39 | -e 's,[^/]*/,../,g' \ 40 | -e 's,/[^/]*$,/Frameworks/'"$fwk"',' ) 41 | echo "replacing with relative path $relative" 42 | install_name_tool -change "$current" "@loader_path/$relative" "$x" 43 | fi 44 | done 45 | done 46 | 47 | find "$app.app" -type f -print | while read x; do 48 | if [ -x "$x" ]; then 49 | qtdep=$(otool -L "$x" | grep Qt | grep amework | grep -v ':$' | grep -v '@loader_path' | awk '{ print $1; }') 50 | if [ -n "$qtdep" ]; then 51 | echo 52 | echo "ERROR: File $x depends on Qt framework(s) not apparently present in the bundle:" 53 | echo $qtdep 54 | exit 1 55 | fi 56 | fi 57 | done 58 | 59 | echo "Done: be sure to run the app and see that it works!" 60 | 61 | 62 | -------------------------------------------------------------------------------- /deploy/linux/docker/Dockerfile_deb.in: -------------------------------------------------------------------------------- 1 | FROM ubuntu:14.04 2 | MAINTAINER Chris Cannam 3 | RUN apt-get update && \ 4 | apt-get install -y \ 5 | software-properties-common \ 6 | build-essential \ 7 | libbz2-dev \ 8 | libfftw3-dev \ 9 | libfishsound1-dev \ 10 | libid3tag0-dev \ 11 | liblo-dev \ 12 | liblrdf0-dev \ 13 | libmad0-dev \ 14 | liboggz2-dev \ 15 | libopus-dev \ 16 | libopusfile-dev \ 17 | libpulse-dev \ 18 | libasound2-dev \ 19 | libjack-dev \ 20 | libsamplerate-dev \ 21 | libsndfile-dev \ 22 | libsord-dev \ 23 | libxml2-utils \ 24 | libboost-all-dev \ 25 | libgl1-mesa-dev \ 26 | raptor-utils \ 27 | librubberband-dev \ 28 | portaudio19-dev \ 29 | qt5-default libqt5svg5-dev \ 30 | git \ 31 | mercurial \ 32 | curl wget \ 33 | mlton \ 34 | autoconf automake libtool lintian 35 | 36 | RUN apt-get clean && rm -rf /var/lib/apt/lists/* 37 | 38 | RUN locale-gen en_US.UTF-8 39 | ENV LANG en_US.UTF-8 40 | ENV LANGUAGE en_US:en 41 | ENV LC_ALL en_US.UTF-8 42 | 43 | RUN hg clone -r[[REVISION]] https://code.soundsoftware.ac.uk/hg/sonic-lineup 44 | 45 | RUN git clone https://github.com/sandstorm-io/capnproto 46 | WORKDIR capnproto 47 | RUN git checkout v0.6.1 48 | WORKDIR c++ 49 | RUN autoreconf -i && ./configure --enable-shared=no --enable-static=yes && make -j3 && make install 50 | 51 | WORKDIR /root 52 | 53 | COPY id_rsa_build .ssh/id_rsa_build 54 | COPY known_hosts .ssh/known_hosts 55 | RUN chmod 600 .ssh/id_rsa_build .ssh/known_hosts 56 | RUN echo '{"accounts": {"sourcehut": "~breakfastquay"}}' > .repoint.json 57 | RUN ( echo '[ui]' ; echo 'ssh = ssh -i /root/.ssh/id_rsa_build' ) > .hgrc 58 | 59 | RUN rm -f /usr/lib/x86_64-linux-gnu/librubberband.so* 60 | 61 | WORKDIR /sonic-lineup 62 | RUN ./configure 63 | RUN make -j3 64 | 65 | RUN deploy/linux/deploy-deb.sh [[RELEASE]] amd64 66 | RUN tar cvf output-deb.tar *.deb && cp output-deb.tar .. 67 | -------------------------------------------------------------------------------- /deploy/linux/deploy-deb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Run this from the build root (with sudo, I think) 4 | 5 | usage() { 6 | echo 7 | echo "Usage:" 8 | echo 9 | echo "$0 " 10 | echo 11 | echo "For example: $0 2.4cc1-1 amd64" 12 | echo 13 | exit 2 14 | } 15 | 16 | version="$1" 17 | arch="$2" 18 | 19 | if [ -z "$version" ] || [ -z "$arch" ]; then 20 | usage 21 | fi 22 | 23 | set -eu 24 | 25 | program=sonic-lineup 26 | checker=vamp-plugin-load-checker 27 | plugins="azi match-vamp-plugin nnls-chroma pyin qm-vamp-plugins tuning-difference" 28 | 29 | depdir=deploy/linux 30 | 31 | targetdir="${program}_${version}_${arch}" 32 | 33 | echo "Target dir is $targetdir" 34 | 35 | if [ -d "$targetdir" ]; then 36 | echo "Target directory exists, not overwriting" 37 | exit 38 | fi 39 | 40 | mkdir "$targetdir" 41 | 42 | cp -r "$depdir"/deb-skeleton/* "$targetdir"/ 43 | 44 | mkdir -p "$targetdir"/usr/bin 45 | mkdir -p "$targetdir"/usr/lib/"$program" 46 | mkdir -p "$targetdir"/usr/share/pixmaps 47 | 48 | cp "$program" "$targetdir"/usr/bin/ 49 | 50 | cp "$checker" "$targetdir"/usr/lib/"$program"/ 51 | 52 | for p in $plugins ; do 53 | cp "$p.so" "$targetdir"/usr/lib/"$program"/ 54 | done 55 | 56 | cp icons/"$program"-icon.svg "$targetdir"/usr/share/pixmaps/ 57 | cp icons/"$program"-icon-128x128.png "$targetdir"/usr/share/pixmaps/"$program"-icon.png 58 | cp "$program".desktop "$targetdir"/usr/share/applications/ 59 | cp README.md "$targetdir"/usr/share/doc/"$program"/ 60 | 61 | perl -i -p -e "s/Architecture: .*/Architecture: $arch/" "$targetdir"/DEBIAN/control 62 | 63 | deps=`bash "$depdir"/debian-dependencies.sh "$program"` 64 | 65 | perl -i -p -e "s/Depends: .*/$deps/" "$targetdir"/DEBIAN/control 66 | 67 | control_ver=${version%-?} 68 | 69 | perl -i -p -e "s/Version: .*/Version: $control_ver/" "$targetdir"/DEBIAN/control 70 | 71 | bash "$depdir"/fix-lintian-bits.sh "$targetdir" 72 | 73 | dpkg-deb --build "$targetdir" && lintian "$targetdir".deb 74 | 75 | -------------------------------------------------------------------------------- /deploy/osx/deploy-and-package.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | notarize=yes 6 | if [ "$1" = "--no-notarization" ]; then 7 | notarize=no 8 | elif [ -n "$1" ]; then 9 | echo "Usage: $0 [--no-notarization]" 10 | exit 2 11 | fi 12 | 13 | set -u 14 | 15 | app="Sonic Lineup" 16 | 17 | version=`perl -p -e 's/^[^"]*"([^"]*)".*$/$1/' version.h` 18 | 19 | source="$app.app" 20 | volume="$app"-"$version" 21 | target="$volume"/"$app".app 22 | dmg="$volume".dmg 23 | 24 | if [ -d "$volume" ]; then 25 | echo "Target directory $volume already exists, not overwriting" 26 | exit 2 27 | fi 28 | 29 | if [ -f "$dmg" ]; then 30 | echo "Target disc image $dmg already exists, not overwriting" 31 | exit 2 32 | fi 33 | 34 | if [ "$notarize" = no ]; then 35 | echo 36 | echo "Note: The --no-notarization flag is set: won't be submitting for notarization" 37 | fi 38 | 39 | echo 40 | echo "(Re-)running deploy script..." 41 | 42 | deploy/osx/deploy.sh "$app" || exit 1 43 | 44 | echo 45 | echo "Making target tree." 46 | 47 | mkdir "$volume" || exit 1 48 | 49 | ln -s /Applications "$volume"/Applications 50 | cp README.md "$volume/README.txt" 51 | cp COPYING "$volume/COPYING.txt" 52 | cp CHANGELOG "$volume/CHANGELOG.txt" 53 | cp -rp "$source" "$target" 54 | 55 | # update file timestamps so as to make the build date apparent 56 | find "$volume" -exec touch \{\} \; 57 | 58 | echo "Done" 59 | 60 | echo 61 | echo "Code-signing volume..." 62 | 63 | deploy/osx/sign.sh "$volume" || exit 1 64 | 65 | echo "Done" 66 | 67 | echo 68 | echo "Making dmg..." 69 | 70 | hdiutil create -srcfolder "$volume" "$dmg" -volname "$volume" -fs HFS+ && 71 | rm -r "$volume" 72 | 73 | echo 74 | echo "Signing dmg..." 75 | 76 | codesign -s "Developer ID Application: Chris Cannam" -fv "$dmg" 77 | 78 | if [ "$notarize" = no ]; then 79 | echo 80 | echo "The --no-notarization flag was set: not submitting for notarization" 81 | else 82 | echo 83 | echo "Submitting dmg for notarization..." 84 | 85 | deploy/osx/notarize.sh "$dmg" || exit 1 86 | fi 87 | 88 | echo "Done" 89 | -------------------------------------------------------------------------------- /deploy/linux/docker/Dockerfile_appimage.in: -------------------------------------------------------------------------------- 1 | FROM ubuntu:14.04 2 | MAINTAINER Chris Cannam 3 | RUN apt-get update && \ 4 | apt-get install -y \ 5 | software-properties-common \ 6 | build-essential \ 7 | libbz2-dev \ 8 | libfftw3-dev \ 9 | libfishsound1-dev \ 10 | libid3tag0-dev \ 11 | liblo-dev \ 12 | liblrdf0-dev \ 13 | libmad0-dev \ 14 | liboggz2-dev \ 15 | libopus-dev \ 16 | libopusfile-dev \ 17 | libpulse-dev \ 18 | libasound2-dev \ 19 | libjack-dev \ 20 | libsamplerate-dev \ 21 | libsndfile-dev \ 22 | libsord-dev \ 23 | libxml2-utils \ 24 | libboost-all-dev \ 25 | libgl1-mesa-dev \ 26 | raptor-utils \ 27 | librubberband-dev \ 28 | git \ 29 | mercurial \ 30 | curl wget \ 31 | mlton \ 32 | autoconf automake libtool lintian 33 | 34 | # NB we do not install portaudio. We don't want to end up including it 35 | # in the bundle, because it comes with a dependency on the JACK 36 | # library which we don't want to bundle and can't assume people will 37 | # have. However, we do install JACK because the Dynamic JACK mechanism 38 | # should ensure we can detect, configure, and use that without 39 | # actually linking against it. We also have Pulse as the default I/O. 40 | 41 | RUN apt-add-repository -y ppa:beineri/opt-qt-5.10.1-trusty 42 | RUN apt-get update && \ 43 | apt-get install -y \ 44 | qt510base \ 45 | qt510svg 46 | RUN apt-get clean && rm -rf /var/lib/apt/lists/* 47 | 48 | RUN locale-gen en_US.UTF-8 49 | ENV LANG en_US.UTF-8 50 | ENV LANGUAGE en_US:en 51 | ENV LC_ALL en_US.UTF-8 52 | 53 | RUN hg clone -r[[REVISION]] https://code.soundsoftware.ac.uk/hg/sonic-lineup 54 | 55 | RUN git clone https://github.com/sandstorm-io/capnproto 56 | WORKDIR capnproto 57 | RUN git checkout v0.6.1 58 | WORKDIR c++ 59 | RUN autoreconf -i && ./configure && make -j3 && make install 60 | 61 | WORKDIR /root 62 | 63 | COPY id_rsa_build .ssh/id_rsa_build 64 | COPY known_hosts .ssh/known_hosts 65 | RUN chmod 600 .ssh/id_rsa_build .ssh/known_hosts 66 | RUN echo '{"accounts": {"sourcehut": "~breakfastquay"}}' > .repoint.json 67 | RUN ( echo '[ui]' ; echo 'ssh = ssh -i /root/.ssh/id_rsa_build' ) > .hgrc 68 | 69 | WORKDIR /sonic-lineup 70 | ENV QTDIR /opt/qt510 71 | ENV PATH /opt/qt510/bin:$PATH 72 | RUN ./configure 73 | RUN make -j3 74 | 75 | RUN deploy/linux/deploy-appimage.sh 76 | RUN tar cvf output-appimage.tar *.AppImage && cp output-appimage.tar .. 77 | -------------------------------------------------------------------------------- /deploy/win64/build-64.bat: -------------------------------------------------------------------------------- 1 | rem Run this from within the top-level SV dir: deploy\win64\build-64.bat 2 | rem To build from clean, delete the folder build_win64 first 3 | 4 | echo on 5 | 6 | set STARTPWD=%CD% 7 | 8 | set QTDIR=C:\Qt\5.13.2\msvc2017_64 9 | if not exist %QTDIR% ( 10 | @ echo Could not find 64-bit Qt in %QTDIR% 11 | @ exit /b 2 12 | ) 13 | 14 | set vcvarsall="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" 15 | 16 | if not exist %vcvarsall% ( 17 | @ echo "Could not find MSVC vars batch file" 18 | @ exit /b 2 19 | ) 20 | 21 | call %vcvarsall% amd64 22 | 23 | set ORIGINALPATH=%PATH% 24 | set PATH=%PATH%;C:\Program Files (x86)\SMLNJ\bin;%QTDIR%\bin 25 | 26 | cd %STARTPWD% 27 | 28 | call .\repoint install 29 | if %errorlevel% neq 0 exit /b %errorlevel% 30 | 31 | sv-dependency-builds\win64-msvc\bin\capnp -Isv-dependency-builds/win64-msvc/include compile --src-prefix=piper/capnp -osv-dependency-builds/win64-msvc/bin/capnpc-c++:piper-vamp-cpp/vamp-capnp piper/capnp/piper.capnp 32 | if %errorlevel% neq 0 exit /b %errorlevel% 33 | 34 | mkdir build_win64 35 | cd build_win64 36 | 37 | qmake -spec win32-msvc -r -tp vc ..\sonic-lineup.pro 38 | if %errorlevel% neq 0 exit /b %errorlevel% 39 | 40 | msbuild sonic-lineup.sln /t:Build /p:Configuration=Release 41 | if %errorlevel% neq 0 exit /b %errorlevel% 42 | 43 | copy .\checker\release\vamp-plugin-load-checker.exe .\release 44 | 45 | copy %QTDIR%\bin\Qt5Core.dll .\release 46 | copy %QTDIR%\bin\Qt5Gui.dll .\release 47 | copy %QTDIR%\bin\Qt5Widgets.dll .\release 48 | copy %QTDIR%\bin\Qt5Network.dll .\release 49 | copy %QTDIR%\bin\Qt5Xml.dll .\release 50 | copy %QTDIR%\bin\Qt5Svg.dll .\release 51 | copy %QTDIR%\bin\Qt5Test.dll .\release 52 | copy %QTDIR%\plugins\platforms\qminimal.dll .\release 53 | copy %QTDIR%\plugins\platforms\qwindows.dll .\release 54 | copy %QTDIR%\plugins\styles\qwindowsvistastyle.dll .\release 55 | copy ..\sv-dependency-builds\win64-msvc\lib\libsndfile-1.dll .\release 56 | 57 | rem some of these expect to be run from the project root 58 | cd .. 59 | build_win64\release\test-svcore-base 60 | if %errorlevel% neq 0 exit /b %errorlevel% 61 | build_win64\release\test-svcore-system 62 | if %errorlevel% neq 0 exit /b %errorlevel% 63 | build_win64\release\test-svcore-data-fileio 64 | if %errorlevel% neq 0 exit /b %errorlevel% 65 | build_win64\release\test-svcore-data-model 66 | if %errorlevel% neq 0 exit /b %errorlevel% 67 | 68 | set PATH=%ORIGINALPATH% 69 | -------------------------------------------------------------------------------- /deploy/win64/build-and-package.bat: -------------------------------------------------------------------------------- 1 | rem Run this from within the top-level SV dir: deploy\win64\build-and-package.bat 2 | 3 | set STARTPWD=%CD% 4 | 5 | if not exist "C:\Program Files (x86)\SMLNJ\bin" ( 6 | @ echo Could not find SML/NJ, required for Repoint 7 | @ exit /b 2 8 | ) 9 | 10 | if not exist "C:\Program Files (x86)\WiX Toolset v3.11\bin" ( 11 | @ echo Could not find WiX Toolset 12 | @ exit /b 2 13 | ) 14 | 15 | powershell -NoProfile -ExecutionPolicy Bypass -Command "& 'deploy\win64\generate-wxs.ps1'" 16 | if errorlevel 1 exit /b %errorlevel% 17 | 18 | set ORIGINALPATH=%PATH% 19 | set PATH=C:\Program Files (x86)\Windows Kits\10\bin\x64;%PATH% 20 | set NAME=Open Source Developer, Christopher Cannam 21 | 22 | set ARG=%1 23 | shift 24 | if "%ARG%" == "sign" ( 25 | @ echo NOTE: sign option specified, will attempt to codesign exe and msi 26 | @ echo NOTE: starting by codesigning an unrelated executable, so we know 27 | @ echo NOTE: whether it'll work before doing the entire build 28 | copy sv-dependency-builds\win64-msvc\bin\capnp.exe signtest.exe 29 | signtool sign /v /n "%NAME%" /t http://time.certum.pl /fd sha1 /a signtest.exe 30 | if errorlevel 1 exit /b %errorlevel% 31 | signtool verify /pa signtest.exe 32 | if errorlevel 1 exit /b %errorlevel% 33 | del signtest.exe 34 | @ echo NOTE: success 35 | ) else ( 36 | @ echo NOTE: sign option not specified, will not codesign anything 37 | ) 38 | 39 | @echo( 40 | @echo Rebuilding 64-bit 41 | 42 | cd %STARTPWD% 43 | del /q /s build_win64 44 | call .\deploy\win64\build-64.bat 45 | if %errorlevel% neq 0 exit /b %errorlevel% 46 | 47 | if "%ARG%" == "sign" ( 48 | @echo Signing 64-bit executables and libraries 49 | signtool sign /v /n "%NAME%" /t http://time.certum.pl /fd sha1 /a build_win64\release\*.exe build_win64\release\*.dll 50 | ) 51 | 52 | set PATH=%PATH%;"C:\Program Files (x86)\WiX Toolset v3.11\bin" 53 | 54 | @echo Packaging 64-bit 55 | 56 | cd %STARTPWD%\build_win64 57 | del sonic-lineup.msi 58 | candle -v ..\deploy\win64\sonic-lineup.wxs 59 | light -b . -ext WixUIExtension -ext WixUtilExtension -v sonic-lineup.wixobj 60 | if %errorlevel% neq 0 exit /b %errorlevel% 61 | del sonic-lineup.wixobj 62 | del sonic-lineup.wixpdb 63 | 64 | if "%ARG%" == "sign" ( 65 | @echo Signing 64-bit package 66 | signtool sign /v /n "%NAME%" /t http://time.certum.pl /fd sha1 /a sonic-lineup.msi 67 | signtool verify /pa sonic-lineup.msi 68 | ) 69 | 70 | set PATH=%ORIGINALPATH% 71 | 72 | cd %STARTPWD% 73 | @echo Done 74 | 75 | -------------------------------------------------------------------------------- /deploy/osx/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | # Execute this from the top-level directory of the project (the one 6 | # that contains the .app bundle). Supply the name of the application 7 | # as argument. 8 | # 9 | # This now performs *only* the app deployment step - copying in 10 | # libraries and setting up paths etc. It does not create a 11 | # package. Use deploy-and-package.sh for that. 12 | 13 | app="$1" 14 | source="$app.app" 15 | 16 | if [ -z "$app" ] || [ ! -d "$source" ] || [ -n "$2" ]; then 17 | echo "Usage: $0 " 18 | echo " e.g. $0 MyApplication" 19 | echo " The app bundle must exist in ./.app." 20 | echo " Version number will be extracted from version.h." 21 | exit 2 22 | fi 23 | 24 | set -u 25 | 26 | version=`perl -p -e 's/^[^"]*"([^"]*)".*$/$1/' version.h` 27 | stem=${version%%-*} 28 | stem=${stem%%pre*} 29 | case "$stem" in 30 | [0-9].[0-9]) bundleVersion="$stem".0 ;; 31 | [0-9].[0-9].[0-9]) bundleVersion="$stem" ;; 32 | *) echo "Error: Version stem $stem (of version $version) is neither two- nor three-part number" ;; 33 | esac 34 | 35 | echo 36 | echo "Copying in Vamp plugins." 37 | 38 | for plugin in azi match-vamp-plugin nnls-chroma pyin qm-vamp-plugins tuning-difference ; do 39 | cp "$plugin.dylib" "$source/Contents/Resources/" 40 | done 41 | 42 | echo 43 | echo "Copying in frameworks and plugins from Qt installation directory." 44 | 45 | deploy/osx/copy-qt.sh "$app" || exit 2 46 | 47 | echo 48 | echo "Fixing up paths." 49 | 50 | deploy/osx/paths.sh "$app" 51 | 52 | echo 53 | echo "Copying in qt.conf to set local-only plugin paths." 54 | echo "Make sure all necessary Qt plugins are in $source/Contents/plugins/*" 55 | echo "You probably want platforms/, accessible/ and imageformats/ subdirectories." 56 | cp deploy/osx/qt.conf "$source"/Contents/Resources/qt.conf 57 | 58 | echo 59 | echo "Copying in plugin load checker." 60 | cp checker/vamp-plugin-load-checker "$source"/Contents/MacOS/ 61 | 62 | echo 63 | echo "Copying in plugin server." 64 | cp piper-vamp-simple-server "$source"/Contents/MacOS/ 65 | 66 | echo 67 | echo "Copying in lproj directories containing InfoPlist.strings translation files." 68 | cp -r i18n/*.lproj "$source"/Contents/Resources/ 69 | 70 | echo 71 | echo "Writing version $bundleVersion in to bundle." 72 | echo "(This should be a three-part number: major.minor.point)" 73 | 74 | perl -p -e "s/VECT_VERSION/$bundleVersion/" deploy/osx/Info.plist \ 75 | > "$source"/Contents/Info.plist 76 | 77 | echo "Done: check $source/Contents/Info.plist for sanity please" 78 | 79 | echo "Done" 80 | -------------------------------------------------------------------------------- /CHANGELOG: -------------------------------------------------------------------------------- 1 | 2 | Changes in Sonic Lineup v1.1 (18 Aug 2020) since the previous release 1.1: 3 | 4 | - Add an Alignment menu allowing you to choose one of a set of 5 | alignment methods, including new sung-notes alignment and an option 6 | for an external program that you supply 7 | 8 | - Add a subsequence alignment option for cases where the "other" 9 | tracks represent only fragments of the "reference" 10 | 11 | - Improve display of alignment views in cases where two adjacent 12 | tracks overlap each other in time only partially or not at all 13 | 14 | - Improve selection of font sizes and pane sizing, especially when 15 | many tracks are loaded 16 | 17 | - Speed up re-opening the application with many tracks in session 18 | 19 | - If alignment fails for all tracks because of some external factor, 20 | show the failure report dialog once only instead of for every track 21 | 22 | 23 | Changes in Sonic Lineup v1.0.1 (10 Dec 2019) since the previous release 1.0: 24 | 25 | - Fix salient features disappearing as the view scrolls 26 | 27 | - Fix failure to open playback device when using macOS Catalina with 28 | certain audio devices 29 | 30 | - Remove dependency on JACK in Linux deb package: the application can 31 | use it if available, but it isn't required 32 | 33 | - Fix failure to make installed executables executable when 34 | installing from the source package 35 | 36 | 37 | Changes in Sonic Lineup v1.0 (25 Oct 2019) since the previous release 0.3: 38 | 39 | - Add ghost reference trace to Sung Pitch view for comparison with 40 | pitch of reference 41 | 42 | - Add first-run explainer dialog 43 | 44 | - Improve rendering of alignment views between panes 45 | 46 | - Fix performance problem when switching to spectrogram mode with 47 | numerous tracks open, especially on Windows 48 | 49 | - Merge major and minor key plots, because of lack of vertical space 50 | 51 | - Fix problems with presentation and alignment of vertical scales 52 | 53 | - Fix ffwd/rewind which could get stuck when used in aligned views 54 | 55 | - Fix incorrect waveform type selection when switching modes, and 56 | ensure outline waveform always uses the same waveform configuration 57 | 58 | - Fix a number of crashes and thread-safety issues 59 | 60 | - Fix sluggishness in starting and stopping playback when using 61 | PulseAudio v13.0+ 62 | 63 | 64 | Changes in Sonic Lineup v0.3 (14 June 2019): 65 | 66 | - First public release 67 | 68 | - First build under this name 69 | 70 | -------------------------------------------------------------------------------- /i18n/tips_en.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 |

Welcome to Sonic Visualiser!

Sonic Visualiser is a 10 | complex application, but it's easy enough to get started with.

11 |

Try importing an audio file and using the Pane menu to add some 12 | different views of it.

Check out the links on the Help menu for 13 | tutorials and other documentation!

14 | 15 |
16 | 17 | 18 |

Sonic Visualiser's window is organised into "panes" and 19 | "layers". To begin with, you have one pane. Import an audio 20 | file to see it displayed in a waveform layer on that pane.

21 | 22 |
23 | 24 | 25 |

Each pane can contain any number of layers, which appear stacked 26 | from "front" to "back" on the same timeline. A layer can contain a 27 | view of audio, or of points (time instants) or data plots (time-values).

28 | 29 |
30 | 31 | 32 |

There's a "layer property box" to the right of each pane, with one 33 | tab for each of the layers on that pane. Click on a layer's tab to 34 | bring that layer to the front. You can then adjust its colour and 35 | other display properties in the property box. 36 | 37 | The first tab is always for the pane itself, which has a few 38 | adjustable properties of its own.

39 | 40 |
41 | 42 | 43 |

If you have more than one pane, only one of them will be "current", 44 | marked with a black bar at the left side. Just click on another pane 45 | to make it current. Most editing operations affect the layer that's 46 | at the front of the current pane.

47 | 48 |
49 | 50 | 51 |

You can use different zoom levels for different panes by un-checking 52 | the Global Zoom control for one of them. By default, all panes will 53 | zoom and scroll together.

54 | 55 |
56 | 57 | 58 |

You can speed up and slow down playback using the Playback Speedup 59 | control in the bottom-right of the window.

60 | 61 |
62 | 63 | 64 |

The Transforms menu lists things you can do to extract features from 65 | or process your audio. The available outputs of any Vamp 66 | feature-extraction plugins or LADSPA audio effects plugins you have 67 | will show up here.

68 | 69 |
70 | 71 |
72 | 73 | 74 | -------------------------------------------------------------------------------- /deploy/win64/build-64-debug.bat: -------------------------------------------------------------------------------- 1 | rem Run this from within the top-level SV dir: deploy\win64\build-64.bat 2 | rem To build from clean, delete the folder build_win64_debug first 3 | 4 | rem NB you will probably also have to change the CONFIG in noconfig.pri 5 | rem from release to debug 6 | 7 | echo on 8 | 9 | set STARTPWD=%CD% 10 | 11 | set QTDIR=C:\Qt\5.13.0\msvc2017_64 12 | if not exist %QTDIR% ( 13 | @ echo Could not find 64-bit Qt 14 | @ exit /b 2 15 | ) 16 | 17 | if not exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" ( 18 | @ echo "Could not find MSVC vars batch file" 19 | @ exit /b 2 20 | ) 21 | 22 | call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 23 | 24 | set ORIGINALPATH=%PATH% 25 | set PATH=%PATH%;C:\Program Files (x86)\SMLNJ\bin;%QTDIR%\bin 26 | 27 | cd %STARTPWD% 28 | 29 | call .\repoint install 30 | if %errorlevel% neq 0 exit /b %errorlevel% 31 | 32 | sv-dependency-builds\win64-msvc\bin\capnp -Isv-dependency-builds/win64-msvc/include compile --src-prefix=piper/capnp -osv-dependency-builds/win64-msvc/bin/capnpc-c++:piper-vamp-cpp/vamp-capnp piper/capnp/piper.capnp 33 | if %errorlevel% neq 0 exit /b %errorlevel% 34 | 35 | mkdir build_win64_debug 36 | cd build_win64_debug 37 | 38 | qmake -spec win32-msvc -r -tp vc ..\sonic-lineup.pro 39 | if %errorlevel% neq 0 exit /b %errorlevel% 40 | 41 | msbuild sonic-lineup.sln /t:Build /p:Configuration=Debug 42 | if %errorlevel% neq 0 exit /b %errorlevel% 43 | 44 | copy .\checker\debug\vamp-plugin-load-checker.exe .\debug 45 | 46 | copy %QTDIR%\bin\Qt5Cored.dll .\debug 47 | copy %QTDIR%\bin\Qt5Guid.dll .\debug 48 | copy %QTDIR%\bin\Qt5Widgetsd.dll .\debug 49 | copy %QTDIR%\bin\Qt5Networkd.dll .\debug 50 | copy %QTDIR%\bin\Qt5Xmld.dll .\debug 51 | copy %QTDIR%\bin\Qt5Svgd.dll .\debug 52 | copy %QTDIR%\bin\Qt5Testd.dll .\debug 53 | copy %QTDIR%\plugins\platforms\qminimald.dll .\debug 54 | copy %QTDIR%\plugins\platforms\qwindowsd.dll .\debug 55 | copy %QTDIR%\plugins\styles\qwindowsvistastyled.dll .\debug 56 | copy ..\sv-dependency-builds\win64-msvc\lib\libsndfile-1.dll .\debug 57 | 58 | rem some of these expect to be run from the project root 59 | cd .. 60 | build_win64_debug\debug\test-svcore-base 61 | if %errorlevel% neq 0 exit /b %errorlevel% 62 | build_win64_debug\debug\test-svcore-system 63 | if %errorlevel% neq 0 exit /b %errorlevel% 64 | build_win64_debug\debug\test-svcore-data-fileio 65 | if %errorlevel% neq 0 exit /b %errorlevel% 66 | build_win64_debug\debug\test-svcore-data-model 67 | if %errorlevel% neq 0 exit /b %errorlevel% 68 | 69 | set PATH=%ORIGINALPATH% 70 | -------------------------------------------------------------------------------- /vectapp.pro: -------------------------------------------------------------------------------- 1 | 2 | TEMPLATE = app 3 | 4 | exists(config.pri) { 5 | include(config.pri) 6 | } 7 | 8 | !exists(config.pri) { 9 | include(noconfig.pri) 10 | } 11 | 12 | include(base.pri) 13 | 14 | QT += network xml gui widgets svg 15 | 16 | TARGET = "Sonic Lineup" 17 | linux*:TARGET = sonic-lineup 18 | solaris*:TARGET = sonic-lineup 19 | 20 | !win32 { 21 | PRE_TARGETDEPS += $$PWD/libbase.a 22 | } 23 | 24 | linux* { 25 | 26 | vect_bins.path = $$PREFIX_PATH/bin/ 27 | vect_bins.files = sonic-lineup 28 | vect_bins.CONFIG = no_check_exist executable 29 | 30 | vect_support.path = $$PREFIX_PATH/lib/sonic-lineup/ 31 | vect_support.files = checker/vamp-plugin-load-checker azi.so match-vamp-plugin.so nnls-chroma.so pyin.so qm-vamp-plugins.so tuning-difference.so 32 | vect_support.CONFIG = no_check_exist executable 33 | 34 | vect_desktop.path = $$PREFIX_PATH/share/applications/ 35 | vect_desktop.files = sonic-lineup.desktop 36 | vect_desktop.CONFIG = no_check_exist 37 | 38 | vect_icon.path = $$PREFIX_PATH/share/icons/hicolor/scalable/apps/ 39 | vect_icon.files = icons/sonic-lineup-icon.svg 40 | vect_icon.CONFIG = no_check_exist 41 | 42 | INSTALLS += vect_bins vect_support vect_desktop vect_icon 43 | } 44 | 45 | TRANSLATIONS += \ 46 | i18n/vect_ru.ts \ 47 | i18n/vect_en_GB.ts \ 48 | i18n/vect_en_US.ts \ 49 | i18n/vect_cs_CZ.ts 50 | 51 | OBJECTS_DIR = o 52 | MOC_DIR = o 53 | 54 | ICON = icons/sonic-lineup-icon.icns 55 | RC_FILE = icons/sonic-lineup.rc 56 | 57 | RESOURCES += sonic-lineup.qrc 58 | 59 | # Mac integration 60 | QMAKE_INFO_PLIST = deploy/osx/Info.plist 61 | 62 | include(svgui/files.pri) 63 | include(svapp/files.pri) 64 | 65 | for (file, SVGUI_SOURCES) { SOURCES += $$sprintf("svgui/%1", $$file) } 66 | for (file, SVAPP_SOURCES) { SOURCES += $$sprintf("svapp/%1", $$file) } 67 | 68 | for (file, SVGUI_HEADERS) { HEADERS += $$sprintf("svgui/%1", $$file) } 69 | for (file, SVAPP_HEADERS) { HEADERS += $$sprintf("svapp/%1", $$file) } 70 | 71 | HEADERS += \ 72 | main/IntroDialog.h \ 73 | main/MainWindow.h \ 74 | main/NetworkPermissionTester.h \ 75 | main/PreferencesDialog.h \ 76 | main/SmallSession.h 77 | 78 | SOURCES += \ 79 | main/IntroDialog.cpp \ 80 | main/main.cpp \ 81 | main/MainWindow.cpp \ 82 | main/NetworkPermissionTester.cpp \ 83 | main/PreferencesDialog.cpp \ 84 | main/SmallSession.cpp 85 | 86 | win32-msvc* { 87 | LIBS += -los 88 | } 89 | 90 | macx* { 91 | QMAKE_POST_LINK += cp checker/vamp-plugin-load-checker . && deploy/osx/deploy.sh $$shell_quote(Sonic Lineup) 92 | } 93 | 94 | linux { 95 | QMAKE_POST_LINK += cp checker/vamp-plugin-load-checker . 96 | } 97 | 98 | -------------------------------------------------------------------------------- /main/NetworkPermissionTester.cpp: -------------------------------------------------------------------------------- 1 | /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 2 | 3 | /* 4 | Sonic Lineup 5 | Comparative visualisation and alignment of related audio recordings 6 | Centre for Digital Music, Queen Mary, University of London. 7 | 8 | This program is free software; you can redistribute it and/or 9 | modify it under the terms of the GNU General Public License as 10 | published by the Free Software Foundation; either version 2 of the 11 | License, or (at your option) any later version. See the file 12 | COPYING included with this distribution for more information. 13 | */ 14 | 15 | #include "NetworkPermissionTester.h" 16 | 17 | #include "../version.h" 18 | 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | 29 | bool 30 | NetworkPermissionTester::havePermission() 31 | { 32 | QSettings settings; 33 | settings.beginGroup("Preferences"); 34 | 35 | QString tag = QString("network-permission-%1").arg(VECT_VERSION); 36 | 37 | bool permish = false; 38 | 39 | if (settings.contains(tag)) { 40 | permish = settings.value(tag, false).toBool(); 41 | } else { 42 | 43 | QDialog d; 44 | d.setWindowTitle(QCoreApplication::translate 45 | ("NetworkPermissionTester", 46 | "Sonic Lineup")); 47 | 48 | QGridLayout *layout = new QGridLayout; 49 | d.setLayout(layout); 50 | 51 | QLabel *label = new QLabel; 52 | label->setWordWrap(true); 53 | label->setText 54 | (QCoreApplication::translate 55 | ("NetworkPermissionTester", 56 | "

Welcome to Sonic Lineup!

" 57 | "

Sonic Lineup is a program for comparative visualisation and alignment of groups of related audio recordings.

" 58 | "

Developed in the Centre for Digital Music at Queen Mary, University of London, Sonic Lineup is open source software under the GNU General Public License.

" 59 | "


" 60 | "

Before we go on...

" 61 | "

Sonic Lineup would like to make occasional network requests, to check for updates." 62 | "

No personal information will be sent, no tracking is carried out, and no information will be shared with anyone else.

" 63 | "

We recommend that you allow this, because it makes Sonic Lineup more useful to you. But if you do not wish to do so, please un-check the box below.

")); 64 | layout->addWidget(label, 0, 0); 65 | 66 | QCheckBox *cb = new QCheckBox(QCoreApplication::translate("NetworkPermissionTester", "Allow this")); 67 | cb->setChecked(true); 68 | layout->addWidget(cb, 1, 0); 69 | 70 | QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok); 71 | QObject::connect(bb, SIGNAL(accepted()), &d, SLOT(accept())); 72 | layout->addWidget(bb, 2, 0); 73 | 74 | d.exec(); 75 | 76 | permish = cb->isChecked(); 77 | settings.setValue(tag, permish); 78 | } 79 | 80 | settings.endGroup(); 81 | 82 | return permish; 83 | } 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /repoint.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | 3 | .SYNOPSIS 4 | A simple manager for third-party source code dependencies. 5 | Run "repoint help" for more documentation. 6 | 7 | #> 8 | 9 | Set-StrictMode -Version 2.0 10 | $ErrorActionPreference = "Stop" 11 | $env:HGPLAIN = "true" 12 | 13 | $sml = $env:REPOINT_SML 14 | 15 | $mydir = Split-Path $MyInvocation.MyCommand.Path -Parent 16 | $program = "$mydir/repoint.sml" 17 | 18 | # We need either Poly/ML or SML/NJ. No great preference as to which. 19 | 20 | # Typical locations 21 | $env:PATH = "$env:PATH;C:\Program Files (x86)\SMLNJ\bin;C:\Program Files\Poly ML;C:\Program Files (x86)\Poly ML" 22 | 23 | if (!$sml) { 24 | if (Get-Command "sml" -ErrorAction SilentlyContinue) { 25 | $sml = "smlnj" 26 | } elseif (Get-Command "polyml" -ErrorAction SilentlyContinue) { 27 | $sml = "poly" 28 | } else { 29 | echo @" 30 | 31 | ERROR: No supported SML compiler or interpreter found 32 | 33 | The Repoint external source code manager needs a Standard ML (SML) 34 | compiler or interpreter to run. 35 | 36 | Please ensure you have one of the following SML implementations 37 | installed and present in your PATH, and try again. 38 | 39 | 1. Standard ML of New Jersey 40 | - executable name: sml 41 | 42 | 2. Poly/ML 43 | - executable name: polyml 44 | 45 | "@ 46 | exit 1 47 | } 48 | } 49 | 50 | if ($args -match "'""") { 51 | $arglist = '["usage"]' 52 | } else { 53 | $arglist = '["' + ($args -join '","') + '"]' 54 | } 55 | 56 | if ($sml -eq "poly") { 57 | 58 | $program = $program -replace "\\","\\\\" 59 | echo "use ""$program""; repoint $arglist" | polyml -q --error-exit | Out-Host 60 | 61 | if (-not $?) { 62 | exit $LastExitCode 63 | } 64 | 65 | } elseif ($sml -eq "smlnj") { 66 | 67 | $lines = @(Get-Content $program) 68 | $lines = $lines -notmatch "val _ = main ()" 69 | 70 | $intro = @" 71 | val smlrun__cp = 72 | let val x = !Control.Print.out in 73 | Control.Print.out := { say = fn _ => (), flush = fn () => () }; 74 | x 75 | end; 76 | val smlrun__prev = ref ""; 77 | Control.Print.out := { 78 | say = fn s => 79 | (if String.isSubstring "Error" s orelse String.isSubstring "Fail" s 80 | then (Control.Print.out := smlrun__cp; 81 | (#say smlrun__cp) (!smlrun__prev); 82 | (#say smlrun__cp) s) 83 | else (smlrun__prev := s; ())), 84 | flush = fn s => () 85 | }; 86 | "@ -split "[\r\n]+" 87 | 88 | $outro = @" 89 | val _ = repoint $arglist; 90 | val _ = OS.Process.exit (OS.Process.success); 91 | "@ -split "[\r\n]+" 92 | 93 | $script = @() 94 | $script += $intro 95 | $script += $lines 96 | $script += $outro 97 | 98 | $tmpfile = ([System.IO.Path]::GetTempFileName()) -replace "[.]tmp",".sml" 99 | 100 | $script | Out-File -Encoding "ASCII" $tmpfile 101 | 102 | $env:CM_VERBOSE="false" 103 | 104 | sml $tmpfile 105 | 106 | if (-not $?) { 107 | del $tmpfile 108 | exit $LastExitCode 109 | } 110 | 111 | del $tmpfile 112 | 113 | } else { 114 | 115 | "Unknown SML implementation name: $sml" 116 | exit 2 117 | } 118 | -------------------------------------------------------------------------------- /deploy/linux/deploy-appimage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eu 4 | 5 | program=sonic-lineup 6 | checker=vamp-plugin-load-checker 7 | plugins="azi match-vamp-plugin nnls-chroma pyin qm-vamp-plugins tuning-difference" 8 | 9 | get_id() { 10 | if [ -d .hg ]; then 11 | hg id | sed 's/[+ ].*$//' 12 | elif [ -d .git ]; then 13 | git rev-parse --short HEAD 14 | else 15 | echo "WARNING: can't figure out revision from VCS metadata" 1>&2 16 | echo "unknown" 17 | fi 18 | } 19 | 20 | version=$(get_id) 21 | 22 | targetdir="${program}.AppDir" 23 | 24 | echo "Target dir is $targetdir" 25 | 26 | if [ -d "$targetdir" ]; then 27 | echo "Target directory exists, not overwriting" 28 | exit 29 | fi 30 | 31 | mkdir "$targetdir" 32 | 33 | mkdir -p "$targetdir"/usr/bin 34 | mkdir -p "$targetdir"/usr/lib/"$program" 35 | 36 | cp "$program" "$targetdir"/usr/bin/ 37 | cp "$checker" "$targetdir"/usr/lib/"$program"/ 38 | 39 | for p in $plugins ; do 40 | cp "$p.so" "$targetdir"/usr/lib/"$program"/ 41 | done 42 | 43 | ldd /usr/lib/x86_64-linux-gnu/libpulse.so.0 || true 44 | 45 | add_dependencies() { 46 | 47 | local binary="$1" 48 | 49 | echo "ldd $binary yields:" 50 | ldd "$binary" 51 | 52 | for lib in $(ldd "$binary" | grep '=> [^ ]*/lib/' | \ 53 | sed 's/^.*=> //' | sed 's/ .*$//'); do 54 | 55 | base=$(basename "$lib") 56 | if grep -v '^#' sv-dependency-builds/linux/appimage/excludelist | 57 | grep -q "^$base$" ; then 58 | echo "excluding: $lib" 59 | continue 60 | fi 61 | 62 | target="$targetdir/usr/lib/$(basename $lib)" 63 | 64 | mkdir -p "$(dirname $target)" 65 | 66 | if [ ! -f "$target" ]; then 67 | 68 | cp -Lv "$lib" "$target" 69 | chmod +x "$target" 70 | 71 | add_dependencies "$lib" 72 | 73 | fi 74 | done 75 | } 76 | 77 | add_dependencies "$program" 78 | add_dependencies "$checker" 79 | 80 | for p in $plugins ; do 81 | add_dependencies "$p.so" 82 | done 83 | 84 | qtplugins="gif icns ico jpeg tga tiff wbmp webp cocoa minimal offscreen xcb" 85 | qtlibdirs="/usr/lib/x86_64-linux-gnu/qt5 /usr/lib/x86_64-linux-gnu/qt /usr/lib/qt5 /usr/lib/qt" 86 | 87 | QTDIR=${QTDIR:-} 88 | if [ -n "$QTDIR" ]; then 89 | qtlibdirs="$QTDIR $qtlibdirs" 90 | fi 91 | 92 | for plug in $qtplugins; do 93 | for libdir in $qtlibdirs; do 94 | lib=$(find $libdir/plugins -name libq$plug.so -print 2>/dev/null || true) 95 | if [ -n "$lib" ]; then 96 | if [ -f "$lib" ]; then 97 | subdir=$(basename $(dirname $lib)) 98 | if [ t"$subdir" = t"plugins" ]; then 99 | subdir="" 100 | fi 101 | target="$targetdir/usr/lib/qt5/plugins/$subdir/$(basename $lib)" 102 | mkdir -p "$(dirname $target)" 103 | cp -v "$lib" "$target" 104 | chmod +x "$target" 105 | add_dependencies "$lib" 106 | break 107 | fi 108 | fi 109 | done 110 | done 111 | 112 | cp "$program.desktop" "$targetdir/" 113 | 114 | cp "icons/$program-icon.svg" "$targetdir/$program-icon.svg" 115 | 116 | cp "deploy/linux/AppRun" "$targetdir/" 117 | 118 | chmod +x "$targetdir/AppRun" 119 | 120 | # Do this with a separate extraction step, so as to make it work even 121 | # in situations where FUSE is unavailable like in a Docker container 122 | export ARCH=x86_64 123 | sv-dependency-builds/linux/appimage/appimagetool-x86_64.AppImage --appimage-extract 124 | ./squashfs-root/AppRun "$targetdir" "SonicLineup-$version-x86_64.AppImage" 125 | 126 | -------------------------------------------------------------------------------- /repoint-project.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "extdir": "." 4 | }, 5 | "services": { 6 | "soundsoftware": { 7 | "vcs": ["hg", "git"], 8 | "anonymous": "https://code.soundsoftware.ac.uk/{vcs}/{repository}", 9 | "authenticated": "https://{account}@code.soundsoftware.ac.uk/{vcs}/{repository}" 10 | } 11 | }, 12 | "libraries": { 13 | "vamp-plugin-sdk": { 14 | "vcs": "hg", 15 | "service": "soundsoftware" 16 | }, 17 | "svcore": { 18 | "vcs": "hg", 19 | "service": "soundsoftware" 20 | }, 21 | "svgui": { 22 | "vcs": "hg", 23 | "service": "soundsoftware" 24 | }, 25 | "svapp": { 26 | "vcs": "hg", 27 | "service": "soundsoftware" 28 | }, 29 | "checker": { 30 | "vcs": "hg", 31 | "service": "soundsoftware", 32 | "repository": "vamp-plugin-load-checker" 33 | }, 34 | "piper": { 35 | "vcs": "git", 36 | "service": "github", 37 | "owner": "piper-audio" 38 | }, 39 | "piper-vamp-cpp": { 40 | "vcs": "git", 41 | "service": "github", 42 | "owner": "piper-audio" 43 | }, 44 | "dataquay": { 45 | "vcs": "hg", 46 | "service": "sourcehut", 47 | "owner": "breakfastquay" 48 | }, 49 | "bqvec": { 50 | "vcs": "hg", 51 | "service": "sourcehut", 52 | "owner": "breakfastquay" 53 | }, 54 | "bqfft": { 55 | "vcs": "hg", 56 | "service": "sourcehut", 57 | "owner": "breakfastquay" 58 | }, 59 | "bqresample": { 60 | "vcs": "hg", 61 | "service": "sourcehut", 62 | "owner": "breakfastquay" 63 | }, 64 | "bqaudioio": { 65 | "vcs": "hg", 66 | "service": "sourcehut", 67 | "owner": "breakfastquay" 68 | }, 69 | "bqaudiostream": { 70 | "vcs": "hg", 71 | "service": "sourcehut", 72 | "owner": "breakfastquay" 73 | }, 74 | "bqthingfactory": { 75 | "vcs": "hg", 76 | "service": "sourcehut", 77 | "owner": "breakfastquay" 78 | }, 79 | "sv-dependency-builds": { 80 | "vcs": "hg", 81 | "service": "soundsoftware" 82 | }, 83 | "icons/scalable": { 84 | "vcs": "hg", 85 | "service": "soundsoftware", 86 | "repository": "sv-iconset" 87 | }, 88 | "match": { 89 | "vcs": "hg", 90 | "service": "soundsoftware", 91 | "repository": "match-vamp", 92 | "branch": "subsequence" 93 | }, 94 | "constant-q-cpp": { 95 | "vcs": "git", 96 | "service": "github", 97 | "owner": "cannam", 98 | "repository": "constant-q-cpp" 99 | }, 100 | "tuning-difference": { 101 | "vcs": "hg", 102 | "service": "soundsoftware" 103 | }, 104 | "pyin": { 105 | "vcs": "hg", 106 | "service": "soundsoftware" 107 | }, 108 | "nnls-chroma": { 109 | "vcs": "hg", 110 | "service": "soundsoftware" 111 | }, 112 | "qm-vamp-plugins": { 113 | "vcs": "git", 114 | "service": "github", 115 | "owner": "c4dm" 116 | }, 117 | "qm-vamp-plugins/lib/qm-dsp": { 118 | "vcs": "git", 119 | "service": "github", 120 | "owner": "c4dm" 121 | }, 122 | "azi": { 123 | "vcs": "hg", 124 | "service": "soundsoftware" 125 | } 126 | } 127 | } 128 | 129 | -------------------------------------------------------------------------------- /deploy/osx/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundlePackageType 6 | APPL 7 | CFBundleName 8 | Sonic Lineup 9 | CFBundleExecutable 10 | Sonic Lineup 11 | CFBundleIconFile 12 | sonic-lineup-icon.icns 13 | CFBundleIdentifier 14 | org.sonicvisualiser.SonicLineup 15 | CFBundleShortVersionString 16 | VECT_VERSION 17 | 18 | 21 | NSMicrophoneUsageDescription 22 | Sonic Lineup needs to use the microphone for recording. 23 | 24 | 25 | NSPrincipalClass 26 | NSApplication 27 | NSHighResolutionCapable 28 | True 29 | 30 | CFBundleDocumentTypes 31 | 32 | 33 | 34 | CFBundleTypeExtensions 35 | 36 | mp3 37 | 38 | CFBundleTypeMIMETypes 39 | 40 | audio/mpeg 41 | 42 | CFBundleTypeName 43 | MP3 Audio 44 | CFBundleTypeRole 45 | Viewer 46 | LSIsAppleDefaultForType 47 | 48 | LSHandlerRank 49 | Alternate 50 | 51 | 52 | CFBundleTypeExtensions 53 | 54 | ogg 55 | oga 56 | 57 | CFBundleTypeMIMETypes 58 | 59 | audio/ogg 60 | 61 | CFBundleTypeName 62 | Ogg Vorbis Audio 63 | CFBundleTypeRole 64 | Viewer 65 | LSIsAppleDefaultForType 66 | 67 | LSHandlerRank 68 | Alternate 69 | 70 | 71 | CFBundleTypeExtensions 72 | 73 | wav 74 | 75 | CFBundleTypeMIMETypes 76 | 77 | audio/x-wav 78 | 79 | CFBundleTypeName 80 | Wave Audio 81 | CFBundleTypeRole 82 | Viewer 83 | LSIsAppleDefaultForType 84 | 85 | LSHandlerRank 86 | Alternate 87 | 88 | 89 | CFBundleTypeExtensions 90 | 91 | aif 92 | aiff 93 | 94 | CFBundleTypeMIMETypes 95 | 96 | audio/x-aiff 97 | 98 | CFBundleTypeName 99 | AIFF Audio 100 | CFBundleTypeRole 101 | Viewer 102 | LSIsAppleDefaultForType 103 | 104 | LSHandlerRank 105 | Alternate 106 | 107 | 108 | CFBundleTypeExtensions 109 | 110 | flac 111 | 112 | CFBundleTypeMIMETypes 113 | 114 | audio/flac 115 | 116 | CFBundleTypeName 117 | FLAC Audio 118 | CFBundleTypeRole 119 | Viewer 120 | LSIsAppleDefaultForType 121 | 122 | LSHandlerRank 123 | Alternate 124 | 125 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /noconfig.pri: -------------------------------------------------------------------------------- 1 | 2 | win32-msvc* { 3 | # Necessary for WinRT header used to determine background colour 4 | CONFIG += c++17 5 | } 6 | !win32-msvc* { 7 | CONFIG += c++14 8 | } 9 | 10 | CONFIG += release 11 | #CONFIG += debug 12 | 13 | PREFIX_PATH = /usr/local 14 | 15 | DEFINES += NDEBUG BUILD_RELEASE 16 | DEFINES += NO_TIMING NO_HIT_COUNTS 17 | 18 | DEFINES += HAVE_PIPER HAVE_PLUGIN_CHECKER_HELPER 19 | 20 | # Full set of defines expected for all platforms when we have the 21 | # sv-dependency-builds subrepo available to provide the dependencies. 22 | 23 | DEFINES += \ 24 | HAVE_BZ2 \ 25 | HAVE_FFTW3 \ 26 | HAVE_FFTW3F \ 27 | HAVE_SNDFILE \ 28 | HAVE_SAMPLERATE \ 29 | HAVE_RUBBERBAND \ 30 | HAVE_LIBLO \ 31 | HAVE_MAD \ 32 | HAVE_ID3TAG \ 33 | HAVE_OPUS \ 34 | HAVE_PORTAUDIO 35 | 36 | # Default set of libs for the above. Config sections below may update 37 | # these. 38 | 39 | LIBS += \ 40 | -lbase \ 41 | -lbz2 \ 42 | -lrubberband \ 43 | -lfftw3 \ 44 | -lfftw3f \ 45 | -lsndfile \ 46 | -lFLAC \ 47 | -logg \ 48 | -lvorbis \ 49 | -lvorbisenc \ 50 | -lvorbisfile \ 51 | -lopusfile \ 52 | -lopus \ 53 | -logg \ 54 | -lmad \ 55 | -lid3tag \ 56 | -lportaudio \ 57 | -lsamplerate \ 58 | -lz \ 59 | -lsord-0 \ 60 | -lserd-0 \ 61 | -llo \ 62 | -lcapnp \ 63 | -lkj 64 | 65 | win32-g++ { 66 | 67 | # This config is currently used for 32-bit Windows builds. 68 | 69 | INCLUDEPATH += $$PWD/sv-dependency-builds/win32-mingw/include $$PWD/sv-dependency-builds/win32-mingw/include/opus 70 | 71 | LIBS += -Lrelease -L$$PWD/sv-dependency-builds/win32-mingw/lib 72 | 73 | DEFINES += NOMINMAX _USE_MATH_DEFINES CAPNP_LITE 74 | 75 | QMAKE_CXXFLAGS_RELEASE += -ffast-math 76 | 77 | # Don't have liblo 78 | DEFINES -= HAVE_LIBLO 79 | LIBS -= -llo 80 | 81 | # (We don't have MediaFoundation support either, with this build sadly) 82 | 83 | LIBS += -lwinmm -lws2_32 84 | } 85 | 86 | win32-msvc* { 87 | 88 | # This config is actually used only for 64-bit Windows builds. 89 | # even though the qmake spec is still called win32-msvc*. If 90 | # we want to do 32-bit builds with MSVC as well, then we'll 91 | # need to add a way to distinguish the two. 92 | 93 | INCLUDEPATH += $$PWD/sv-dependency-builds/win64-msvc/include $$PWD/sv-dependency-builds/win64-msvc/include/opus /Libraries/boost_1_71_0 /Libraries/boost_1_69_0 $$PWD/../boost_1_69_0/ 94 | 95 | # This seems to be intruding even when we're supposed to be release 96 | # CONFIG(debug) { 97 | # LIBS += -NODEFAULTLIB:MSVCRT -Ldebug \ 98 | # -L$$PWD/sv-dependency-builds/win64-msvc/lib/debug \ 99 | # -L$$PWD/sv-dependency-builds/win64-msvc/lib 100 | # } 101 | CONFIG(release) { 102 | LIBS += -NODEFAULTLIB:LIBCMT -Lrelease \ 103 | -L$$PWD/sv-dependency-builds/win64-msvc/lib 104 | } 105 | 106 | DEFINES += NOMINMAX _USE_MATH_DEFINES CAPNP_LITE HAVE_MEDIAFOUNDATION _HAS_STD_BYTE=0 107 | 108 | QMAKE_CXXFLAGS_RELEASE += -fp:fast 109 | 110 | LIBS -= -lFLAC -lvorbis -lvorbisenc -lvorbisfile 111 | 112 | # These have different names 113 | LIBS -= -lsord-0 -lserd-0 114 | LIBS += -lsord -lserd 115 | 116 | # Don't have liblo 117 | DEFINES -= HAVE_LIBLO 118 | LIBS -= -llo 119 | 120 | LIBS += -lmfplat -lmfreadwrite -lmfuuid -lpropsys -ladvapi32 -lwinmm -lws2_32 121 | } 122 | 123 | macx* { 124 | 125 | # All Mac builds are 64-bit these days. 126 | 127 | INCLUDEPATH += $$PWD/sv-dependency-builds/osx/include $$PWD/sv-dependency-builds/osx/include/opus 128 | LIBS += -L$$PWD/sv-dependency-builds/osx/lib -L$$PWD 129 | 130 | INCLUDEPATH += /usr/local/opt/boost/include $$PWD/../boost_1_74_0 131 | 132 | QMAKE_CXXFLAGS_RELEASE += -O3 -ffast-math -flto 133 | QMAKE_LFLAGS_RELEASE += -O3 -flto 134 | 135 | QMAKE_LFLAGS_RELEASE += -isysroot $$QMAKE_MAC_SDK_PATH 136 | 137 | DEFINES += HAVE_COREAUDIO HAVE_VDSP 138 | LIBS += \ 139 | -framework CoreAudio \ 140 | -framework CoreMidi \ 141 | -framework AudioUnit \ 142 | -framework AudioToolbox \ 143 | -framework CoreFoundation \ 144 | -framework CoreServices \ 145 | -framework Accelerate 146 | } 147 | 148 | linux* { 149 | 150 | message("Building without ./configure on Linux is unlikely to work") 151 | message("If you really want to try it, remove this from noconfig.pri") 152 | error("Refusing to build without ./configure first") 153 | } 154 | 155 | -------------------------------------------------------------------------------- /repoint: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Disable shellcheck warnings for useless-use-of-cat. UUOC is good 4 | # practice, not bad: clearer, safer, less error-prone. 5 | # shellcheck disable=SC2002 6 | 7 | sml="$REPOINT_SML" 8 | 9 | set -eu 10 | 11 | # avoid gussying up output 12 | export HGPLAIN=true 13 | 14 | mydir=$(dirname "$0") 15 | program="$mydir/repoint.sml" 16 | 17 | hasher= 18 | local_install= 19 | if [ -w "$mydir" ]; then 20 | if echo | sha256sum >/dev/null 2>&1 ; then 21 | hasher=sha256sum 22 | local_install=true 23 | elif echo | shasum >/dev/null 2>&1 ; then 24 | hasher=shasum 25 | local_install=true 26 | else 27 | echo "WARNING: sha256sum or shasum program not found" 1>&2 28 | fi 29 | fi 30 | 31 | if [ -n "$local_install" ]; then 32 | hash=$(echo "$sml" | cat "$program" - | $hasher | cut -c1-16) 33 | gen_sml=$mydir/.repoint-$hash.sml 34 | gen_out=$mydir/.repoint-$hash.bin 35 | trap 'rm -f $gen_sml' 0 36 | else 37 | gen_sml=$(mktemp /tmp/repoint-XXXXXXXX.sml) 38 | gen_out=$(mktemp /tmp/repoint-XXXXXXXX.bin) 39 | trap 'rm -f $gen_sml $gen_out' 0 40 | fi 41 | 42 | if [ -x "$gen_out" ]; then 43 | exec "$gen_out" "$@" 44 | fi 45 | 46 | # We need one of Poly/ML, SML/NJ, MLton, or MLKit. Since we're running 47 | # a single-file SML program as if it were a script, our order of 48 | # preference is usually based on startup speed. An exception is the 49 | # local_install case, where we retain a persistent binary 50 | 51 | if [ -z "$sml" ]; then 52 | if [ -n "$local_install" ] && mlton 2>&1 | grep -q 'MLton'; then 53 | sml="mlton" 54 | elif sml -h 2>&1 | grep -q 'Standard ML of New Jersey'; then 55 | sml="smlnj" 56 | # We would prefer Poly/ML to SML/NJ, except that Poly v5.7 has a 57 | # nasty bug that occasionally causes it to deadlock on startup. 58 | # That is fixed in v5.7.1, so we could promote it up the order 59 | # again at some point in future 60 | elif echo | poly -v 2>/dev/null | grep -q 'Poly/ML'; then 61 | sml="polyml" 62 | elif mlton 2>&1 | grep -q 'MLton'; then 63 | sml="mlton" 64 | # MLKit is at the bottom because it leaves compiled files around 65 | # in an MLB subdir in the current directory 66 | elif mlkit 2>&1 | grep -q 'MLKit'; then 67 | sml="mlkit" 68 | else cat 1>&2 <&2 </dev/null 2>&1 ; then 114 | if [ ! -x "$gen_out" ]; then 115 | polyc -o "$gen_out" "$program" 116 | fi 117 | "$gen_out" "$@" 118 | else 119 | echo 'use "'"$program"'"; repoint ['"$arglist"'];' | 120 | poly -q --error-exit 121 | fi ;; 122 | mlton) 123 | if [ ! -x "$gen_out" ]; then 124 | echo "[Precompiling Repoint binary...]" 1>&2 125 | echo "val _ = main ()" | cat "$program" - > "$gen_sml" 126 | mlton -output "$gen_out" "$gen_sml" 127 | fi 128 | "$gen_out" "$@" ;; 129 | mlkit) 130 | if [ ! -x "$gen_out" ]; then 131 | echo "[Precompiling Repoint binary...]" 1>&2 132 | echo "val _ = main ()" | cat "$program" - > "$gen_sml" 133 | mlkit -output "$gen_out" "$gen_sml" 134 | fi 135 | "$gen_out" "$@" ;; 136 | smlnj) 137 | cat "$program" | ( 138 | cat < (), flush = fn () => () }; 142 | x 143 | end; 144 | val smlrun__prev = ref ""; 145 | Control.Print.out := { 146 | say = fn s => 147 | (if String.isSubstring " Error" s 148 | then (Control.Print.out := smlrun__cp; 149 | (#say smlrun__cp) (!smlrun__prev); 150 | (#say smlrun__cp) s) 151 | else (smlrun__prev := s; ())), 152 | flush = fn s => () 153 | }; 154 | EOF 155 | cat - 156 | cat < "$gen_sml" 161 | CM_VERBOSE=false sml "$gen_sml" ;; 162 | *) 163 | echo "ERROR: Unknown SML implementation name: $sml" 1>&2; 164 | exit 2 ;; 165 | esac 166 | 167 | -------------------------------------------------------------------------------- /main/SmallSession.cpp: -------------------------------------------------------------------------------- 1 | /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 2 | 3 | /* 4 | Sonic Lineup 5 | Comparative visualisation and alignment of related audio recordings 6 | Centre for Digital Music, Queen Mary, University of London. 7 | 8 | This program is free software; you can redistribute it and/or 9 | modify it under the terms of the GNU General Public License as 10 | published by the Free Software Foundation; either version 2 of the 11 | License, or (at your option) any later version. See the file 12 | COPYING included with this distribution for more information. 13 | */ 14 | 15 | #include "SmallSession.h" 16 | 17 | #include "base/TempWriteFile.h" 18 | #include "base/XmlExportable.h" 19 | #include "base/Exceptions.h" 20 | 21 | #include 22 | #include 23 | #include 24 | 25 | void 26 | SmallSession::save(const SmallSession &session, QString sessionFile) 27 | { 28 | TempWriteFile tempFile(sessionFile); 29 | QString tempFilePath(tempFile.getTemporaryFilename()); 30 | 31 | QFile f(tempFilePath); 32 | if (!f.open(QIODevice::WriteOnly | QIODevice::Text)) { 33 | throw std::runtime_error("Failed to open temporary file for writing"); 34 | } 35 | 36 | QTextStream out(&f); 37 | out.setCodec(QTextCodec::codecForName("UTF-8")); 38 | 39 | out << "\n" 40 | << "\n" 41 | << "\n"; 42 | 43 | out << (QString(" \n") 45 | .arg(XmlExportable::encodeEntities(session.mainFile))); 46 | 47 | for (int i = 0; in_range_for(session.additionalFiles, i); ++i) { 48 | 49 | out << (QString(" \n") 51 | .arg(i + 2) 52 | .arg(XmlExportable::encodeEntities 53 | (session.additionalFiles[i]))); 54 | } 55 | 56 | out << "\n"; 57 | 58 | f.close(); 59 | 60 | try { 61 | tempFile.moveToTarget(); 62 | } catch (const FileOperationFailed &f) { 63 | throw std::runtime_error("Failed to move temporary file to save target"); 64 | } 65 | } 66 | 67 | class SmallSessionReadHandler : public QXmlDefaultHandler 68 | { 69 | public: 70 | SmallSessionReadHandler() : 71 | m_inVectContext(false) { 72 | } 73 | virtual ~SmallSessionReadHandler() { 74 | } 75 | 76 | bool startElement(const QString & /* namespaceURI */, 77 | const QString & /* localName */, 78 | const QString &qName, 79 | const QXmlAttributes& attributes) override { 80 | 81 | QString name = qName.toLower(); 82 | 83 | if (name == "vect") { 84 | if (m_inVectContext) { 85 | m_errorString = "Nested session contexts found"; 86 | } else { 87 | m_inVectContext = true; 88 | } 89 | } else if (name == "model") { 90 | if (!m_inVectContext) { 91 | m_errorString = "Model found outside session context"; 92 | } else { 93 | readModel(attributes); 94 | } 95 | } else { 96 | SVCERR << "WARNING: SmallSessionReadHandler: Unexpected element \"" 97 | << name << "\"" << endl; 98 | } 99 | 100 | return true; 101 | } 102 | 103 | void readModel(const QXmlAttributes &attributes) { 104 | 105 | QString type = attributes.value("type").trimmed(); 106 | bool isMainModel = (attributes.value("mainModel").trimmed() == "true"); 107 | 108 | if (type == "wavefile") { 109 | 110 | QString file = attributes.value("file"); 111 | 112 | if (isMainModel) { 113 | if (m_session.mainFile != "") { 114 | m_errorString = "Duplicate main model found"; 115 | } else { 116 | m_session.mainFile = file; 117 | } 118 | } else { 119 | m_session.additionalFiles.push_back(file); 120 | } 121 | 122 | } else { 123 | SVCERR << "WARNING: SmallSessionReadHandler: Unsupported model type \"" 124 | << type << "\"" << endl; 125 | } 126 | } 127 | 128 | bool error(const QXmlParseException &exception) override { 129 | m_errorString = 130 | QString("%1 at line %2, column %3") 131 | .arg(exception.message()) 132 | .arg(exception.lineNumber()) 133 | .arg(exception.columnNumber()); 134 | SVCERR << "ERROR: SmallSessionReadHandler: " << m_errorString << endl; 135 | return QXmlDefaultHandler::error(exception); 136 | } 137 | 138 | bool fatalError(const QXmlParseException &exception) override { 139 | m_errorString = 140 | QString("%1 at line %2, column %3") 141 | .arg(exception.message()) 142 | .arg(exception.lineNumber()) 143 | .arg(exception.columnNumber()); 144 | SVCERR << "ERROR: SmallSessionReadHandler: " << m_errorString << endl; 145 | return QXmlDefaultHandler::fatalError(exception); 146 | } 147 | 148 | bool isOK() const { return (m_errorString == ""); } 149 | QString getErrorString() const { return m_errorString; } 150 | SmallSession getSession() const { return m_session; } 151 | 152 | private: 153 | SmallSession m_session; 154 | QString m_errorString; 155 | bool m_inVectContext; 156 | }; 157 | 158 | SmallSession 159 | SmallSession::load(QString path) 160 | { 161 | QFile f(path); 162 | if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) { 163 | throw std::runtime_error("Failed to open file for reading"); 164 | } 165 | 166 | SmallSessionReadHandler handler; 167 | QXmlSimpleReader reader; 168 | reader.setContentHandler(&handler); 169 | reader.setErrorHandler(&handler); 170 | 171 | QXmlInputSource source(&f); 172 | bool ok = reader.parse(source); 173 | 174 | if (!handler.isOK()) { 175 | throw std::runtime_error 176 | (("Session XML load failed: " + handler.getErrorString()) 177 | .toStdString()); 178 | } else if (!ok) { 179 | throw std::runtime_error("Session XML parse failed"); 180 | } 181 | 182 | return handler.getSession(); 183 | } 184 | 185 | -------------------------------------------------------------------------------- /vect-mac.qss: -------------------------------------------------------------------------------- 1 | /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 2 | 3 | /* 4 | Vect 5 | An experimental audio player for plural recordings of a work 6 | Centre for Digital Music, Queen Mary, University of London. 7 | 8 | This file is based on the Thorn theme of the Rosegarden MIDI and 9 | audio sequencer and notation editor. Copyright 2006-2014 10 | D. Michael McIntyre and the Rosegarden team. 11 | 12 | This program is free software; you can redistribute it and/or 13 | modify it under the terms of the GNU General Public License as 14 | published by the Free Software Foundation; either version 2 of the 15 | License, or (at your option) any later version. See the file 16 | COPYING included with this distribution for more information. 17 | */ 18 | 19 | QWidget 20 | { 21 | background: #333333; 22 | color: #FAFAFA; 23 | } 24 | 25 | QDialog 26 | { 27 | background-color: #333333; 28 | } 29 | 30 | QFrame#BottomFrame, 31 | QFrame#BottomFrame > QFrame 32 | { 33 | background-color: #333333; 34 | } 35 | 36 | QLabel 37 | { 38 | background: transparent; 39 | color: white; 40 | } 41 | 42 | QMenu 43 | { 44 | background-color: #EEEEEE; 45 | border: 1px solid black; 46 | } 47 | 48 | QMenu::separator 49 | { 50 | height: 2px; 51 | background: #AAAAAA; 52 | margin-left: 10px; 53 | margin-right: 5px; 54 | } 55 | 56 | QMenu::item:enabled 57 | { 58 | background-color: transparent; 59 | color: #000000; 60 | padding: 2px 25px 2px 20px; 61 | border: 1px solid transparent; 62 | min-width: 12em; /* leaves room for space between item and hotkey */ 63 | } 64 | 65 | QMenu::item:!enabled 66 | { 67 | color: #AAAAAA; 68 | padding: 2px 25px 2px 20px; 69 | border: 1px solid transparent; 70 | min-width: 12em; /* leaves room for space between item and hotkey */ 71 | } 72 | 73 | QMenu::item:selected 74 | { 75 | background-color: #80AFFF; 76 | color: #FFFFFF; 77 | } 78 | 79 | QCheckBox:enabled QLabel, 80 | QCheckBox:enabled 81 | { 82 | color: #FFFFFF 83 | } 84 | 85 | QCheckbox:!enabled QLabel, 86 | QCheckBox:!enabled 87 | { 88 | color: #000000; 89 | } 90 | 91 | QCheckBox::indicator:enabled 92 | { 93 | background: url(:icons/style/checkbox-checked.png); 94 | } 95 | 96 | QCheckBox 97 | { 98 | spacing: 5px; 99 | } 100 | 101 | QCheckBox::indicator 102 | { 103 | width: 13px; 104 | height: 13px; 105 | } 106 | 107 | QCheckBox::indicator:unchecked 108 | { 109 | image: url(:icons/style/checkbox_unchecked.png); 110 | } 111 | 112 | QCheckBox::indicator:!enabled 113 | { 114 | image: url(:icons/style/checkbox_disabled.png); 115 | } 116 | 117 | QCheckBox::indicator:checked:!enabled 118 | { 119 | image: url(:icons/style/checkbox_checked_disabled.png); 120 | } 121 | 122 | QCheckBox::indicator:unchecked:hover 123 | { 124 | image: url(:icons/style/checkbox_unchecked_hover.png); 125 | } 126 | 127 | QCheckBox::indicator:unchecked:pressed 128 | { 129 | image: url(:icons/style/checkbox_unchecked_pressed.png); 130 | } 131 | 132 | QCheckBox::indicator:checked 133 | { 134 | image: url(:icons/style/checkbox_checked.png); 135 | } 136 | 137 | QCheckBox::indicator:checked:hover 138 | { 139 | image: url(:icons/style/checkbox_checked_hover.png); 140 | } 141 | 142 | QCheckBox::indicator:checked:pressed 143 | { 144 | image: url(:icons/style/checkbox_checked_pressed.png); 145 | } 146 | 147 | QCheckBox::indicator:indeterminate 148 | { 149 | image: url(:icons/style/checkbox_indeterminate.png); 150 | } 151 | 152 | QCheckBox::indicator:indeterminate:hover 153 | { 154 | image: url(:icons/style/checkbox_indeterminate_hover.png); 155 | } 156 | 157 | QCheckBox::indicator:indeterminate:pressed 158 | { 159 | image: url(:icons/style/checkbox_indeterminate_pressed.png); 160 | } 161 | 162 | QRadioButton:enabled QLabel, 163 | QRadioButton:enabled 164 | { 165 | color: #FFFFFF; 166 | } 167 | 168 | QRadioButton:!enabled QLabel, 169 | QRadioButton:!enabled 170 | { 171 | color: #000000; 172 | } 173 | 174 | QRadioButton::indicator 175 | { 176 | width: 13px; 177 | height: 13px; 178 | } 179 | 180 | QRadioButton::indicator::unchecked:enabled 181 | { 182 | image: url(:icons/style/radiobutton_unchecked.png); 183 | } 184 | 185 | QRadioButton::indicator::unchecked:!enabled 186 | { 187 | image: url(:icons/style/radiobutton_unchecked_disabled.png); 188 | } 189 | 190 | QRadioButton::indicator:unchecked:hover:enabled 191 | { 192 | image: url(:icons/style/radiobutton_unchecked_hover.png); 193 | } 194 | 195 | QRadioButton::indicator:unchecked:hover:!enabled 196 | { 197 | image: url(:icons/style/radiobutton_unchecked_hover_disabled.png); 198 | } 199 | 200 | QRadioButton::indicator:unchecked:pressed:enabled 201 | { 202 | image: url(:icons/style/radiobutton_unchecked_pressed.png); 203 | } 204 | 205 | QRadioButton::indicator:unchecked:pressed:!enabled 206 | { 207 | image: url(:icons/style/radiobutton_unchecked_pressed_disabled.png); 208 | } 209 | 210 | QRadioButton::indicator::checked:enabled 211 | { 212 | image: url(:icons/style/radiobutton_checked.png); 213 | } 214 | 215 | QRadioButton::indicator::checked:!enabled 216 | { 217 | image: url(:icons/style/radiobutton_checked_disabled.png); 218 | } 219 | 220 | QRadioButton::indicator:checked:hover:enabled 221 | { 222 | image: url(:icons/style/radiobutton_checked_hover.png); 223 | } 224 | 225 | QRadioButton::indicator:checked:hover:!enabled 226 | { 227 | image: url(:icons/style/radiobutton_checked_hover_disabled.png); 228 | } 229 | 230 | QRadioButton::indicator:checked:pressed:enabled 231 | { 232 | image: url(:icons/style/radiobutton_checked_pressed.png); 233 | } 234 | 235 | QRadioButton::indicator:checked:pressed:!enabled 236 | { 237 | image: url(:icons/style/radiobutton_checked_pressed_disabled.png); 238 | } 239 | 240 | QMenuBar 241 | { 242 | background-color: #404040; 243 | } 244 | 245 | QMenuBar::item 246 | { 247 | spacing: 3px; /* spacing between menu bar items */ 248 | padding: 1px 4px; 249 | background: transparent; 250 | color: #FFFFFF; 251 | } 252 | 253 | QMenuBar::item:selected 254 | { 255 | background-color: #80AFFF; 256 | color: #FFFFFF; 257 | } 258 | 259 | QMenuBar::item:pressed 260 | { 261 | background-color: #BBCEFF; 262 | } 263 | 264 | QMessageBox 265 | { 266 | background: #000000; 267 | } 268 | 269 | QProgressBar 270 | { 271 | border: 1px solid #AAAAAA; 272 | border-radius: 3px; 273 | text-align: center; 274 | background: #FFFFFF; 275 | } 276 | 277 | QProgressBar::chunk 278 | { 279 | background-color: #89B8E7; 280 | width: 20px; 281 | } 282 | 283 | QToolButton 284 | { 285 | background-color: transparent; 286 | border: 0px; 287 | } 288 | 289 | QPushButton, 290 | QFileDialog QPushButton, 291 | QDialog QPushButton 292 | { 293 | border: 2px solid #AAAAAA; 294 | border-radius: 2px; 295 | padding: 0.18em; 296 | padding-left: 0.5em; 297 | padding-right: 0.5em; 298 | margin-top: 0.1em; 299 | margin-bottom: 0.1em; 300 | margin-left: 0.2em; 301 | margin-right: 0.2em; 302 | } 303 | 304 | QPushButton:disabled, 305 | QFileDialog QPushButton:disabled, 306 | QDialog QPushButton:disabled 307 | { 308 | color: #AAAAAA; 309 | } 310 | 311 | QPushButton:pressed, 312 | QFileDialog QPushButton:pressed, 313 | QDialog QPushButton:pressed, 314 | QFileDialog QPushButton:on, 315 | QDialog QPushButton:on 316 | { 317 | background-color: #BBCEFF; 318 | } 319 | 320 | QPushButton::enabled:hover 321 | { 322 | background-color: #666666; 323 | } 324 | 325 | QPushButton::checked 326 | { 327 | background-color: #666666; 328 | } 329 | -------------------------------------------------------------------------------- /configure.ac: -------------------------------------------------------------------------------- 1 | 2 | AC_INIT([Sonic Lineup], [], cannam@all-day-breakfast.com) 3 | 4 | AC_CONFIG_SRCDIR(main/main.cpp) 5 | 6 | # Autoconf will set CXXFLAGS; we don't usually want it to, because we 7 | # either define our own flags (at least if GCC is in use) or else use 8 | # the user's preferences. We need to ensure CXXFLAGS is only set if 9 | # the user has expressly set it. So, save the user's (or empty) 10 | # setting now and restore it after Autoconf has done its bit of 11 | # piddling about. 12 | USER_CXXFLAGS="$CXXFLAGS" 13 | 14 | # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead 15 | if test x"$USER_CXXFLAGS" = x; then 16 | if test x"$CFLAGS" != x; then 17 | USER_CXXFLAGS="$CFLAGS" 18 | fi 19 | fi 20 | 21 | AC_LANG_CPLUSPLUS 22 | 23 | AC_PROG_CC 24 | AC_PROG_CXX 25 | AC_PROG_INSTALL 26 | AC_PROG_MKDIR_P 27 | 28 | # We are daringly making use of C++11 now 29 | AX_CXX_COMPILE_STDCXX_11(noext) 30 | 31 | AC_HEADER_STDC 32 | 33 | # These are the flags Autoconf guesses for us; we use them later if 34 | # the user has set none and we are not using GCC (so lack our own 35 | # preferred flags) 36 | AUTOCONF_CXXFLAGS="$CXXFLAGS" 37 | 38 | PKG_PROG_PKG_CONFIG 39 | 40 | SV_CHECK_QT 41 | 42 | SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" 43 | SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING -DNO_HIT_COUNTS" 44 | 45 | # Now we have: USER_CXXFLAGS contains any flags the user set 46 | # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought 47 | # we should use. If we have GCC, we override the latter but then 48 | # allow ourselves to be overridden (later) by the former 49 | 50 | CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" 51 | OPTFLAGS_DEBUG="-O2" 52 | LDFLAGS_DEBUG="" 53 | CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" 54 | OPTFLAGS_RELEASE="-O2" 55 | LDFLAGS_RELEASE="" 56 | CXXSTANDARD=c++14 57 | 58 | if test "x$GCC" = "xyes"; then 59 | CXXFLAGS_ANY="-fpic -Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe" 60 | CXXFLAGS_DEBUG="$CXXFLAGS_ANY -g -Werror" 61 | OPTFLAGS_DEBUG="-O2" 62 | CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0" 63 | OPTFLAGS_RELEASE="-O3 -ffast-math" 64 | LIBS_DEBUG="$LIBS" 65 | AX_CHECK_COMPILE_FLAG(--std=$CXXSTANDARD, [], [AC_MSG_NOTICE([Compiler does not appear to support $CXXSTANDARD, falling back to c++11]) 66 | CXXSTANDARD=c++11]) 67 | fi 68 | 69 | CXXFLAGS_BUILD="$CXXFLAGS_RELEASE $OPTFLAGS_RELEASE" 70 | LDFLAGS_BUILD="$LDFLAGS_RELEASE $OPTFLAGS_RELEASE" 71 | SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" 72 | 73 | QMAKE_CONFIG="release" 74 | 75 | AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug],[enable debug support [default=no]])],[AC_MSG_NOTICE([enabling debug build]) 76 | QMAKE_CONFIG="debug" 77 | CXXFLAGS_BUILD="$CXXFLAGS_DEBUG $OPTFLAGS_DEBUG" 78 | LDFLAGS_BUILD="$LDFLAGS_DEBUG" 79 | SV_DEFINES_BUILD="$SV_DEFINES_DEBUG" 80 | LIBS="$LIBS_DEBUG"]) 81 | 82 | if test x"$USER_CXXFLAGS" != x; then 83 | AC_MSG_NOTICE([The CXXFLAGS environment variable is set to "$USER_CXXFLAGS".]) 84 | AC_MSG_NOTICE(Overriding default compiler flags with the above user setting.) 85 | CXXFLAGS_BUILD="$USER_CXXFLAGS" 86 | LDFLAGS_BUILD="" 87 | fi 88 | 89 | CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" 90 | LDFLAGS="$LDFLAGS_BUILD" 91 | 92 | SV_MODULE_REQUIRED([bz2],[],[bzlib.h],[bz2],[BZ2_bzReadOpen]) 93 | SV_MODULE_REQUIRED([fftw3],[fftw3 >= 3.0.0],[fftw3.h],[fftw3],[fftw_execute]) 94 | SV_MODULE_REQUIRED([fftw3f],[fftw3f >= 3.0.0],[fftw3.h],[fftw3f],[fftwf_execute]) 95 | SV_MODULE_REQUIRED([sndfile],[sndfile >= 1.0.16],[sndfile.h],[sndfile],[sf_open]) 96 | SV_MODULE_REQUIRED([samplerate],[samplerate >= 0.1.2],[samplerate.h],[samplerate],[src_new]) 97 | SV_MODULE_REQUIRED([rubberband],[rubberband],[rubberband/RubberBandStretcher.h],[rubberband],[rubberband_new]) 98 | SV_MODULE_REQUIRED([sord],[sord-0 >= 0.5],[sord/sord.h],[sord-0],[sord_world_new]) 99 | SV_MODULE_REQUIRED([serd],[serd-0 >= 0.5],[serd/serd.h],[serd-0],[serd_reader_read_file]) 100 | 101 | # We need a Cap'n Proto version with the expectedSizeInWordsFromPrefix 102 | # function, which appeared in v0.6. If we can't find at least that 103 | # version with pkg-config, we check for the symbol with the compiler. 104 | PKG_CHECK_MODULES([capnp],[capnp >= 0.6],[HAVES="$HAVES HAVE_CAPNP";CXXFLAGS="$CXXFLAGS $capnp_CFLAGS";LIBS="$LIBS $capnp_LIBS"],[AC_MSG_NOTICE([Failed to find required module capnp using pkg-config, trying again by old-fashioned means])]) 105 | if test -z "$capnp_LIBS" ; then 106 | AC_COMPILE_IFELSE([ 107 | AC_LANG_SOURCE([[ 108 | #include 109 | int main() { 110 | kj::Array prefix; 111 | return capnp::expectedSizeInWordsFromPrefix(prefix.asPtr()); 112 | }]])], 113 | [HAVES="$HAVES HAVE_CAPNP";LIBS="$LIBS -lcapnp -lkj"], 114 | [AC_MSG_ERROR([Failed to find appropriate capnp library])] 115 | ) 116 | fi 117 | 118 | SV_MODULE_OPTIONAL([liblo],[],[lo/lo.h],[lo],[lo_address_new]) 119 | SV_MODULE_OPTIONAL([portaudio_2_0],[portaudio-2.0 >= 19],[portaudio.h],[portaudio],[Pa_IsFormatSupported]) 120 | SV_MODULE_OPTIONAL([JACK],[jack >= 0.100],[jack/jack.h],[jack],[jack_client_open]) 121 | SV_MODULE_OPTIONAL([libpulse],[libpulse >= 0.9],[pulse/pulseaudio.h],[pulse],[pa_stream_new]) 122 | 123 | SV_MODULE_REQUIRED([lrdf],[lrdf >= 0.2],[lrdf.h],[lrdf],[lrdf_init]) 124 | SV_MODULE_REQUIRED([oggz],[oggz >= 1.0.0],[oggz/oggz.h],[oggz],[oggz_run]) 125 | SV_MODULE_REQUIRED([fishsound],[fishsound >= 1.0.0],[fishsound/fishsound.h],[fishsound],[fish_sound_new]) 126 | SV_MODULE_REQUIRED([mad],[mad >= 0.15.0],[mad.h],[mad],[mad_decoder_init]) 127 | SV_MODULE_REQUIRED([id3tag],[id3tag >= 0.15.0],[id3tag.h],[id3tag],[id3_tag_new]) 128 | SV_MODULE_REQUIRED([opus],[opusfile],[opus/opusfile.h],[opusfile],[op_read_float]) 129 | 130 | # Link in -lX11 if it exists -- this is for the X error handler 131 | SV_MODULE_OPTIONAL([X11],[x11 >= 1.0.0],[X11/X.h],[x11],[XGetErrorText]) 132 | 133 | AC_SUBST(PERL) 134 | AC_SUBST(XARGS) 135 | AC_SUBST(MAKEDEPEND) 136 | AC_SUBST(SHA1SUM) 137 | AC_SUBST(CUT) 138 | 139 | AC_SUBST(CFLAGS) 140 | AC_SUBST(CXXFLAGS) 141 | AC_SUBST(CXXSTANDARD) 142 | AC_SUBST(LDFLAGS) 143 | AC_SUBST(HAVES) 144 | AC_SUBST(LIBS) 145 | 146 | AC_SUBST(CC) 147 | AC_SUBST(CXX) 148 | 149 | AC_SUBST(QMAKE_CONFIG) 150 | 151 | AC_CONFIG_FILES([config.pri]) 152 | 153 | AC_OUTPUT 154 | 155 | if test -x repoint ; then 156 | if test -d .hg -o -d .git ; then 157 | if ! ./repoint install; then 158 | AC_MSG_ERROR([Repoint failed; please fix any reported errors and try again]) 159 | fi 160 | else 161 | AC_MSG_NOTICE([Repoint executable found but not in an Hg or Git working-copy: not running it]) 162 | if ! test -d vamp-plugin-sdk ; then 163 | AC_MSG_WARN([No vamp-plugin-sdk directory present, so external libraries might not have been updated]) 164 | fi 165 | fi 166 | else 167 | AC_MSG_NOTICE([No Repoint executable found: assuming external components are already here]) 168 | if ! test -d vamp-plugin-sdk ; then 169 | AC_MSG_WARN([No vamp-plugin-sdk directory present, so external components might not have been updated]) 170 | fi 171 | fi 172 | 173 | if ! $QMAKE -r sonic-lineup.pro; then 174 | AC_MSG_ERROR([qmake failed: Command was "$QMAKE -r"]) 175 | fi 176 | 177 | AC_MSG_NOTICE([ 178 | 179 | Configuration complete. 180 | Please check the above messages for any warnings that you 181 | might care about, and then run "make". 182 | 183 | The file config.pri contains the configuration settings for 184 | qmake. If you want to adjust these by hand, edit config.pri 185 | and run "$QMAKE -r" again to regenerate the Makefile. 186 | ]) 187 | -------------------------------------------------------------------------------- /main/IntroDialog.cpp: -------------------------------------------------------------------------------- 1 | /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 2 | 3 | /* 4 | Sonic Lineup 5 | Comparative visualisation and alignment of related audio recordings 6 | Centre for Digital Music, Queen Mary, University of London. 7 | 8 | This program is free software; you can redistribute it and/or 9 | modify it under the terms of the GNU General Public License as 10 | published by the Free Software Foundation; either version 2 of the 11 | License, or (at your option) any later version. See the file 12 | COPYING included with this distribution for more information. 13 | */ 14 | 15 | #include "IntroDialog.h" 16 | 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | 29 | #include "widgets/IconLoader.h" 30 | 31 | #include 32 | #include 33 | 34 | using namespace std; 35 | 36 | void 37 | IntroDialog::show(QWidget *parent) 38 | { 39 | QSettings settings; 40 | settings.beginGroup("IntroDialog"); 41 | if (settings.value("shown", false).toBool()) { 42 | return; 43 | } 44 | 45 | QDialog d(parent, Qt::SplashScreen); 46 | d.setWindowTitle(d.tr("Welcome!")); 47 | 48 | vector> texts { 49 | { d.tr("Welcome!"), 50 | d.tr("

The first thing is to open some audio files. The Open button
" 51 | "is on the toolbar up here.

" 52 | "

(But please read these introductory notes first!)

" 53 | "

If you have more than one recording of the same thing,
" 54 | "such as multiple performances, takes, or even cover versions," 55 | "
try opening them all in one go.

" 56 | "

Comparative visualisation is what this app is designed for.

" 57 | "

You can also record a new track directly from the " 58 | "microphone.

") 59 | }, 60 | { d.tr("Scroll, zoom, and play"), 61 | d.tr("

Your audio files will all appear in this main pane.

" 62 | "

Drag left and right to move through time, and use
" 63 | "two-finger scroll-drag, or a scroll wheel, to zoom.

" 64 | "

You can also move using the left and right cursor keys,
" 65 | "and zoom using the up and down keys.

" 66 | "

%1 will try to align the audio files, so as to
" 67 | "ensure they scroll together in terms of musical material.
" 68 | "You can toggle or control alignment in the Playback menu.

" 69 | ).arg(QApplication::applicationName()) 70 | }, 71 | { d.tr("Change your view"), 72 | d.tr("

Use the buttons along the bottom to change the current view.

" 73 | "

There are two waveform views: \"Outline\" for a simplified
" 74 | "overview, or a more typical waveform for detail. And two
" 75 | "spectrograms with different frequency and colour profiles.

" 76 | "

The \"Sung pitch\" view shows pitch profiles, in the case of
" 77 | "solo singing or similar music; \"Key\" is a key-likelihood plot;
" 78 | "and \"Stereo azimuth\" gives a stereo-plan decomposition.

" 79 | "

See the documentation in the Help menu for more details.

" 80 | "" 81 | ) 82 | } 83 | }; 84 | 85 | QGridLayout *outerLayout = new QGridLayout; 86 | d.setLayout(outerLayout); 87 | QFrame *outerFrame = new QFrame; 88 | #ifdef Q_OS_WIN32 89 | outerFrame->setFrameStyle(QFrame::Panel | QFrame::Raised); 90 | #endif 91 | outerLayout->addWidget(outerFrame, 0, 0); 92 | 93 | QGridLayout *layout = new QGridLayout; 94 | outerFrame->setLayout(layout); 95 | layout->setRowStretch(0, 10); 96 | layout->setRowStretch(1, 20); 97 | layout->setRowStretch(2, 10); 98 | layout->setRowStretch(3, 0); 99 | layout->setColumnStretch(0, 0); 100 | layout->setColumnStretch(1, 0); 101 | layout->setColumnStretch(2, 20); 102 | 103 | int page = 1; 104 | 105 | vector arrowFiles { 106 | ":icons/scalable/arrow-above-white.svg", 107 | ":icons/scalable/arrow-left-white.svg", 108 | ":icons/scalable/arrow-below-white.svg" 109 | }; 110 | 111 | int dpratio = d.devicePixelRatio(); 112 | int sz = dpratio * int(round(parent->height() * 0.1)); 113 | 114 | vector arrowPixmaps { 115 | QPixmap(sz, sz), 116 | QPixmap(sz, (sz * 6) / 10), 117 | QPixmap(sz, sz) 118 | }; 119 | 120 | for (int i = 0; i < int(arrowFiles.size()); ++i) { 121 | arrowPixmaps[i].fill(Qt::transparent); 122 | QPainter painter(&arrowPixmaps[i]); 123 | QSvgRenderer renderer(arrowFiles[i]); 124 | renderer.render(&painter); 125 | arrowPixmaps[i].setDevicePixelRatio(dpratio); 126 | } 127 | 128 | vector arrowLabels; 129 | 130 | for (auto p: arrowPixmaps) { 131 | QLabel *arrowLabel = new QLabel; 132 | arrowLabel->setPixmap(p); 133 | arrowLabel->setVisible(arrowLabels.empty()); 134 | arrowLabels.push_back(arrowLabel); 135 | } 136 | 137 | layout->addWidget(arrowLabels[0], 0, 0); 138 | layout->addWidget(arrowLabels[1], 1, 0, 1, 1, Qt::AlignTop); 139 | layout->addWidget(arrowLabels[2], 1, 0, 1, 1, Qt::AlignBottom); 140 | 141 | QFont smallerFont(d.font()); 142 | #ifdef Q_OS_WIN32 143 | if (smallerFont.pixelSize() > 0) { 144 | smallerFont.setPixelSize(int(ceil(smallerFont.pixelSize() * 1.1))); 145 | } else { 146 | smallerFont.setPointSize(int(ceil(smallerFont.pointSize() * 1.1))); 147 | } 148 | #endif 149 | 150 | QFont biggerFont(d.font()); 151 | if (biggerFont.pixelSize() > 0) { 152 | biggerFont.setPixelSize(int(ceil(biggerFont.pixelSize() * 1.4))); 153 | } else { 154 | biggerFont.setPointSize(int(ceil(biggerFont.pointSize() * 1.4))); 155 | } 156 | 157 | QLabel *numberLabel = new QLabel; 158 | numberLabel->setText(d.tr("%1.").arg(page)); 159 | layout->addWidget(numberLabel, 0, 1, 1, 1, 160 | Qt::AlignRight | Qt::AlignBottom); 161 | numberLabel->setFont(biggerFont); 162 | 163 | QLabel *titleLabel = new QLabel; 164 | titleLabel->setText(texts[page-1].first); 165 | titleLabel->setFont(biggerFont); 166 | layout->addWidget(titleLabel, 0, 2, 1, 1, 167 | Qt::AlignLeft | Qt::AlignBottom); 168 | 169 | QLabel *bodyLabel = new QLabel; 170 | bodyLabel->setWordWrap(false); 171 | bodyLabel->setText(texts[page-1].second); 172 | bodyLabel->setFont(smallerFont); 173 | layout->addWidget(bodyLabel, 1, 2); 174 | 175 | QDialogButtonBox *bb = new QDialogButtonBox; 176 | 177 | QPushButton *prev = bb->addButton 178 | (d.tr("&Prev"), QDialogButtonBox::ActionRole); 179 | prev->setIcon(IconLoader().load("rewind")); 180 | prev->setEnabled(false); 181 | 182 | QPushButton *next = bb->addButton 183 | (d.tr("&Next"), QDialogButtonBox::ActionRole); 184 | next->setIcon(IconLoader().load("ffwd")); 185 | 186 | QPushButton *close = bb->addButton(QDialogButtonBox::Close); 187 | QObject::connect(close, SIGNAL(clicked()), &d, SLOT(accept())); 188 | close->setIcon(IconLoader().load("cross")); 189 | close->setEnabled(false); 190 | layout->addWidget(bb, 3, 0, 1, 3); 191 | 192 | auto repage = 193 | [&](int step) 194 | { 195 | arrowLabels[page-1]->hide(); 196 | 197 | int npages = int(texts.size()); 198 | page += step; 199 | 200 | prev->setEnabled(page > 1); 201 | 202 | next->setEnabled(page < npages); 203 | next->setDefault(page < npages); 204 | 205 | close->setEnabled(page == npages); 206 | close->setDefault(page == npages); 207 | 208 | numberLabel->setText(d.tr("%1.").arg(page)); 209 | titleLabel->setText(texts[page-1].first); 210 | bodyLabel->setText(texts[page-1].second); 211 | 212 | arrowLabels[page-1]->show(); 213 | }; 214 | 215 | QObject::connect(next, &QPushButton::clicked, [&]() { repage(1); }); 216 | QObject::connect(prev, &QPushButton::clicked, [&]() { repage(-1); }); 217 | 218 | d.setMinimumSize(QSize(int(ceil(parent->width() * 0.4)), 219 | int(ceil(parent->height() * 0.6)))); 220 | d.setModal(false); 221 | d.exec(); 222 | 223 | settings.setValue("shown", true); 224 | } 225 | 226 | -------------------------------------------------------------------------------- /main/PreferencesDialog.cpp: -------------------------------------------------------------------------------- 1 | /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 2 | 3 | /* 4 | Sonic Lineup 5 | Comparative visualisation and alignment of related audio recordings 6 | Centre for Digital Music, Queen Mary, University of London. 7 | 8 | This program is free software; you can redistribute it and/or 9 | modify it under the terms of the GNU General Public License as 10 | published by the Free Software Foundation; either version 2 of the 11 | License, or (at your option) any later version. See the file 12 | COPYING included with this distribution for more information. 13 | */ 14 | 15 | #include "PreferencesDialog.h" 16 | 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | 34 | #include "widgets/WindowTypeSelector.h" 35 | #include "widgets/IconLoader.h" 36 | #include "base/Preferences.h" 37 | 38 | PreferencesDialog::PreferencesDialog(QWidget *parent) : 39 | QDialog(parent), 40 | m_changesOnRestart(false) 41 | { 42 | setWindowTitle(tr("Sonic Lineup: Application Preferences")); 43 | 44 | Preferences *prefs = Preferences::getInstance(); 45 | 46 | QGridLayout *grid = new QGridLayout; 47 | setLayout(grid); 48 | 49 | QTabWidget *tab = new QTabWidget; 50 | grid->addWidget(tab, 0, 0); 51 | 52 | tab->setTabPosition(QTabWidget::North); 53 | 54 | // Create this first, as slots that get called from the ctor will 55 | // refer to it 56 | m_applyButton = new QPushButton(tr("Apply")); 57 | 58 | // Create all the preference widgets first, then create the 59 | // individual tab widgets and place the preferences in their 60 | // appropriate places in one go afterwards 61 | 62 | m_tuningFrequency = prefs->getTuningFrequency(); 63 | 64 | QDoubleSpinBox *frequency = new QDoubleSpinBox; 65 | frequency->setMinimum(100.0); 66 | frequency->setMaximum(5000.0); 67 | frequency->setSuffix(" Hz"); 68 | frequency->setSingleStep(1); 69 | frequency->setValue(m_tuningFrequency); 70 | frequency->setDecimals(2); 71 | 72 | connect(frequency, SIGNAL(valueChanged(double)), 73 | this, SLOT(tuningFrequencyChanged(double))); 74 | 75 | QSettings settings; 76 | settings.beginGroup("Preferences"); 77 | m_useAlignmentProgram = settings.value("use-external-alignment", false).toBool(); 78 | QString program = settings.value("external-alignment-program", "").toString(); 79 | m_alignmentProgram = program; 80 | program.replace("$HOME", tr("")); 81 | settings.endGroup(); 82 | 83 | m_alignmentProgramToggle = new QCheckBox(); 84 | connect(m_alignmentProgramToggle, SIGNAL(clicked()), 85 | this, SLOT(alignmentProgramToggleClicked())); 86 | m_alignmentProgramToggle->setChecked(m_useAlignmentProgram); 87 | m_alignmentProgramEdit = new QLineEdit; 88 | m_alignmentProgramEdit->setText(program); 89 | m_alignmentProgramEdit->setReadOnly(true); 90 | m_alignmentProgramEdit->setEnabled(m_useAlignmentProgram); 91 | m_alignmentProgramButton = new QPushButton(); 92 | m_alignmentProgramButton->setIcon(IconLoader().load("fileopen")); 93 | connect(m_alignmentProgramButton, SIGNAL(clicked()), 94 | this, SLOT(alignmentProgramButtonClicked())); 95 | m_alignmentProgramButton->setFixedSize(QSize(24, 24)); 96 | m_alignmentProgramButton->setEnabled(m_useAlignmentProgram); 97 | 98 | m_normaliseAudio = prefs->getNormaliseAudio(); 99 | m_normaliseAudioToggle = new QCheckBox(); 100 | m_normaliseAudioToggle->setChecked(m_normaliseAudio); 101 | connect(m_normaliseAudioToggle, SIGNAL(clicked()), 102 | this, SLOT(normaliseAudioToggleClicked())); 103 | 104 | QFrame *frame = new QFrame; 105 | 106 | QGridLayout *subgrid = new QGridLayout; 107 | frame->setLayout(subgrid); 108 | 109 | int row = 0; 110 | 111 | subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel 112 | ("Tuning Frequency"))), 113 | row, 0); 114 | subgrid->addWidget(frequency, row++, 2, 1, 1); 115 | 116 | subgrid->addWidget(new QLabel(tr("%1:").arg(tr("Use external alignment program"))), 117 | row, 0); 118 | subgrid->addWidget(m_alignmentProgramToggle, row, 1, 1, 1); 119 | subgrid->addWidget(m_alignmentProgramEdit, row, 2, 1, 1); 120 | subgrid->addWidget(m_alignmentProgramButton, row, 3, 1, 1); 121 | row++; 122 | 123 | subgrid->addWidget(new QLabel(tr("%1:").arg(tr("Normalise audio"))), row, 0); 124 | subgrid->addWidget(m_normaliseAudioToggle, row, 1, 1, 1); 125 | row++; 126 | 127 | subgrid->setColumnStretch(2, 10); 128 | subgrid->setRowStretch(row, 10); 129 | 130 | tab->addTab(frame, tr("&General")); 131 | 132 | QDialogButtonBox *bb = new QDialogButtonBox(Qt::Horizontal); 133 | grid->addWidget(bb, 1, 0); 134 | 135 | QPushButton *ok = new QPushButton(tr("OK")); 136 | QPushButton *cancel = new QPushButton(tr("Cancel")); 137 | bb->addButton(ok, QDialogButtonBox::AcceptRole); 138 | bb->addButton(m_applyButton, QDialogButtonBox::ApplyRole); 139 | bb->addButton(cancel, QDialogButtonBox::RejectRole); 140 | connect(ok, SIGNAL(clicked()), this, SLOT(okClicked())); 141 | connect(m_applyButton, SIGNAL(clicked()), this, SLOT(applyClicked())); 142 | connect(cancel, SIGNAL(clicked()), this, SLOT(cancelClicked())); 143 | 144 | m_applyButton->setEnabled(false); 145 | } 146 | 147 | PreferencesDialog::~PreferencesDialog() 148 | { 149 | std::cerr << "PreferencesDialog::~PreferencesDialog()" << std::endl; 150 | } 151 | 152 | void 153 | PreferencesDialog::tuningFrequencyChanged(double freq) 154 | { 155 | m_tuningFrequency = freq; 156 | m_applyButton->setEnabled(true); 157 | } 158 | 159 | void 160 | PreferencesDialog::alignmentProgramToggleClicked() 161 | { 162 | m_useAlignmentProgram = m_alignmentProgramToggle->isChecked(); 163 | m_alignmentProgramEdit->setEnabled(m_useAlignmentProgram); 164 | m_alignmentProgramButton->setEnabled(m_useAlignmentProgram); 165 | m_applyButton->setEnabled(true); 166 | m_changesOnRestart = true; 167 | } 168 | 169 | void 170 | PreferencesDialog::alignmentProgramButtonClicked() 171 | { 172 | QString file = QFileDialog::getOpenFileName 173 | (this, tr("Select an external alignment program to run"), 174 | m_alignmentProgram); 175 | if (file == "") return; 176 | m_alignmentProgram = file; 177 | file.replace("$HOME", tr("")); 178 | m_alignmentProgramEdit->setText(file); 179 | m_applyButton->setEnabled(true); 180 | m_changesOnRestart = true; 181 | } 182 | 183 | void 184 | PreferencesDialog::normaliseAudioToggleClicked() 185 | { 186 | m_normaliseAudio = m_normaliseAudioToggle->isChecked(); 187 | m_applyButton->setEnabled(true); 188 | m_changesOnRestart = true; 189 | } 190 | 191 | void 192 | PreferencesDialog::okClicked() 193 | { 194 | applyClicked(); 195 | accept(); 196 | } 197 | 198 | void 199 | PreferencesDialog::applyClicked() 200 | { 201 | Preferences *prefs = Preferences::getInstance(); 202 | prefs->setTuningFrequency(m_tuningFrequency); 203 | prefs->setNormaliseAudio(m_normaliseAudio); 204 | 205 | QSettings settings; 206 | settings.beginGroup("Preferences"); 207 | settings.setValue("use-external-alignment", m_useAlignmentProgram); 208 | settings.setValue("external-alignment-program", m_alignmentProgram); 209 | settings.endGroup(); 210 | 211 | m_applyButton->setEnabled(false); 212 | 213 | if (m_changesOnRestart) { 214 | QMessageBox::information(this, tr("Preferences"), 215 | tr("One or more of the application preferences you have changed may not take full effect until Sonic Lineup is restarted.\nPlease exit and restart the application now if you want these changes to take effect immediately.")); 216 | m_changesOnRestart = false; 217 | } 218 | } 219 | 220 | void 221 | PreferencesDialog::cancelClicked() 222 | { 223 | reject(); 224 | } 225 | 226 | void 227 | PreferencesDialog::applicationClosing(bool quickly) 228 | { 229 | if (quickly) { 230 | reject(); 231 | return; 232 | } 233 | 234 | if (m_applyButton->isEnabled()) { 235 | int rv = QMessageBox::warning 236 | (this, tr("Preferences Changed"), 237 | tr("Some preferences have been changed but not applied.\n" 238 | "Apply them before closing?"), 239 | QMessageBox::Apply | QMessageBox::Discard, 240 | QMessageBox::Discard); 241 | if (rv == QMessageBox::Apply) { 242 | applyClicked(); 243 | accept(); 244 | } else { 245 | reject(); 246 | } 247 | } else { 248 | accept(); 249 | } 250 | } 251 | 252 | --------------------------------------------------------------------------------