# HG changeset patch # User Chris Cannam # Date 1163614946 0 # Node ID e200055fe80b264666c6abdf1848a9d841743514 # Parent 34dc23246f46c522e7c9b9aa34c0832c41105cf6 * Add vertical zooming and snap-to-selection for OSC control; add a demo script diff -r 34dc23246f46 -r e200055fe80b main/MainWindow.cpp --- a/main/MainWindow.cpp Tue Nov 14 16:06:00 2006 +0000 +++ b/main/MainWindow.cpp Wed Nov 15 18:22:26 2006 +0000 @@ -151,6 +151,8 @@ this, SLOT(currentLayerChanged(Pane *, Layer *))); connect(m_paneStack, SIGNAL(rightButtonMenuRequested(Pane *, QPoint)), this, SLOT(rightButtonMenuRequested(Pane *, QPoint))); + connect(m_paneStack, SIGNAL(propertyStacksResized()), + this, SLOT(propertyStacksResized())); m_overview = new Overview(frame); m_overview->setViewManager(m_viewManager); @@ -2986,6 +2988,10 @@ m_paneStack->setCurrentPane(pane); m_paneStack->setCurrentLayer(pane, newLayer); + std::cerr << "MainWindow::addPane: global centre frame is " + << m_viewManager->getGlobalCentreFrame() << std::endl; + pane->setCentreFrame(m_viewManager->getGlobalCentreFrame()); + CommandHistory::getInstance()->endCompoundOperation(); updateMenuStates(); @@ -3451,6 +3457,19 @@ } void +MainWindow::propertyStacksResized() +{ +/* + std::cerr << "MainWindow::propertyStacksResized" << std::endl; + Pane *pane = m_paneStack->getCurrentPane(); + if (pane && m_overview) { + std::cerr << "Fixed width: " << pane->width() << std::endl; + m_overview->setFixedWidth(pane->width()); + } +*/ +} + +void MainWindow::showLayerTree() { QTreeView *view = new QTreeView(); @@ -3636,8 +3655,8 @@ if (getMainModel()) { - unsigned long f0 = getMainModel()->getStartFrame(); - unsigned long f1 = getMainModel()->getEndFrame(); + int f0 = getMainModel()->getStartFrame(); + int f1 = getMainModel()->getEndFrame(); bool done = false; @@ -3653,6 +3672,17 @@ f0 = lrint(t0 * getMainModel()->getSampleRate()); f1 = lrint(t1 * getMainModel()->getSampleRate()); + + Pane *pane = m_paneStack->getCurrentPane(); + Layer *layer = 0; + if (pane) layer = pane->getSelectedLayer(); + if (layer) { + size_t resolution; + layer->snapToFeatureFrame(pane, f0, resolution, + Layer::SnapLeft); + layer->snapToFeatureFrame(pane, f1, resolution, + Layer::SnapRight); + } } else if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { @@ -3843,6 +3873,40 @@ } } + } else if (message.getMethod() == "zoomvertical") { + + Pane *pane = m_paneStack->getCurrentPane(); + Layer *layer = 0; + if (pane && pane->getLayerCount() > 0) { + layer = pane->getLayer(pane->getLayerCount() - 1); + } + int defaultStep = 0; + int steps = 0; + if (layer) { + steps = layer->getVerticalZoomSteps(defaultStep); + if (message.getArgCount() == 1 && steps > 0) { + if (message.getArg(0).canConvert(QVariant::String) && + message.getArg(0).toString() == "in") { + int step = layer->getCurrentVerticalZoomStep() + 1; + if (step < steps) layer->setVerticalZoomStep(step); + } else if (message.getArg(0).canConvert(QVariant::String) && + message.getArg(0).toString() == "out") { + int step = layer->getCurrentVerticalZoomStep() - 1; + if (step >= 0) layer->setVerticalZoomStep(step); + } else if (message.getArg(0).canConvert(QVariant::String) && + message.getArg(0).toString() == "default") { + layer->setVerticalZoomStep(defaultStep); + } + } else if (message.getArgCount() == 2) { + if (message.getArg(0).canConvert(QVariant::Double) && + message.getArg(1).canConvert(QVariant::Double)) { + double min = message.getArg(0).toDouble(); + double max = message.getArg(1).toDouble(); + layer->setDisplayExtents(min, max); + } + } + } + } else if (message.getMethod() == "quit") { m_abandoning = true; @@ -3886,7 +3950,8 @@ Layer *newLayer = m_document->createDerivedLayer (transform, getMainModel(), - PluginTransform::ExecutionContext(), + TransformFactory::getInstance()->getDefaultContextForTransform + (transform, getMainModel()), ""); if (newLayer) { diff -r 34dc23246f46 -r e200055fe80b main/MainWindow.h --- a/main/MainWindow.h Tue Nov 14 16:06:00 2006 +0000 +++ b/main/MainWindow.h Wed Nov 15 18:22:26 2006 +0000 @@ -192,6 +192,8 @@ void rightButtonMenuRequested(Pane *, QPoint point); + void propertyStacksResized(); + void preferenceChanged(PropertyContainer::PropertyName); void setupRecentFilesMenu(); diff -r 34dc23246f46 -r e200055fe80b osc/demoscript.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/osc/demoscript.sh Wed Nov 15 18:22:26 2006 +0000 @@ -0,0 +1,391 @@ +#!/bin/bash + +audio=$HOME/music +preferred=$audio/ogg/linux +list=audiofiles.txt +used=audiofiles-used.txt + +sv-command quit + +pick_file() +{ + count=`wc -l "$list" 2>/dev/null | awk '{ print $1 }'` + if [ ! -f "$list" ] || [ "$count" -eq "0" ] ; then + find "$audio" -name \*.ogg -print >> "$list" + find "$audio" -name \*.mp3 -print >> "$list" + find "$audio" -name \*.wav -print >> "$list" + find "$preferred" -name \*.ogg -print >> "$list" + find "$preferred" -name \*.mp3 -print >> "$list" + find "$preferred" -name \*.wav -print >> "$list" + count=`wc -l "$list" 2>/dev/null | awk '{ print $1 }'` + fi + while [ -z "$file" ]; do + index=$((RANDOM % $count)) + file=`tail +"$index" "$list" | head -1` + [ -f "$file" ] || continue + done + fgrep -v "$file" "$list" > "$list"_ && mv "$list"_ "$list" + echo "$file" +} + +load_a_file() +{ + file=`pick_file` + if ! sv-command open "$file"; then + pid="`pidof sonic-visualiser`" + if [ -z "$pid" ]; then + ( setsid ../sonic-visualiser & ) + sleep 2 + load_a_file + else + echo "ERROR: Unable to contact sonic-visualiser pid $pid" 1>&2 + exit 1 + fi + fi +} + +show_stuff() +{ + sv-command set overlays 2 + sv-command set zoomwheels 1 + sv-command set propertyboxes 1 +} + +hide_stuff() +{ + sv-command set overlays 0 + sv-command set zoomwheels 0 + sv-command set propertyboxes 0 +} + +reset() +{ + for pane in 1 2 3 4 5; do + for layer in 1 2 3 4 5 6 7 8 9 10; do + sv-command delete layer + done + sv-command delete pane + done + sv-command zoom default + sv-command add waveform + show_stuff +} + +scroll_and_zoom() +{ + sv-command set overlays 0 + sv-command set zoomwheels 0 + sv-command set propertyboxes 0 + sv-command setcurrent 1 1 + sv-command delete layer + sv-command setcurrent 1 1 + sv-command set layer Colour Red + sleep 1 + sv-command set pane Global-Zoom off + sv-command set pane Global-Scroll off + sv-command set pane Follow-Playback Scroll + for zoom in 950 900 850 800 750 700 650 600 550 512 450 400 350 300 256 192 160 128 96 64 48 32 24 16; do + sv-command zoom $zoom + sleep 0.1 + done +} + +play() +{ + sv-command play "$@" +} + +fade_in() +{ + sv-command set gain 0 + sleep 0.5 + play "$@" + for gain in 0.001 0.01 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1; do + sv-command set gain $gain + sleep 0.1 + done +} + +fade_out() +{ + for gain in 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0.05 0.01 0.001; do + sv-command set gain $gain + sleep 0.1 + done + stop + sv-command set gain 1 +} + +slow() +{ + for speed in -1 -10 -20 -30 -40 -50 -60 -70 -80 -100 -140 -200 -250 -300 -400 -500 -700 -800 -900 -1000; do + sv-command set speedup "$speed" + sleep 1 + done +} + +stop() +{ + sv-command stop "$@" + sv-command set speedup 0 +} + +quit() +{ + sv-command quit +} + +add_melodic_range_spectrogram() +{ + sv-command set propertyboxes 1 + sv-command add spectrogram + sv-command set layer Window-Size 4096 +# sv-command set layer Window-Overlap 4 + sv-command set layer Window-Overlap 3 + sv-command set layer Frequency-Scale Log + sv-command set layer Colour-Scale Meter +} + +zoom_in_spectrogram() +{ + sv-command zoomvertical 43 8000 + for x in 1 2 3 4 5 6; do + max=$((8000 - 1000*$x)) + sv-command zoomvertical 43 "$max" + sleep 0.1 + done + for x in 1 2 3 4 5; do + max=$((2000 - 100 * $x)) + sv-command zoomvertical 43 "$max" + sleep 0.1 + done +} + +zoom_in_spectrogram_further() +{ + for x in 1 2 3 4 5; do + sv-command zoomvertical in + done +} + +playback_bits() +{ + sv-command set pane Follow-Playback Scroll + sv-command jump 10 + sv-command setcurrent 1 2 + sv-command set layer Colour Blue + sleep 5 + hide_stuff + fade_in + sleep 10 + scroll_and_zoom + sleep 10 + slow + #sv-command set layer Normalize-Visible-Area on + for zoom in 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1; do + sv-command zoom $zoom + sleep 0.1 + done + sleep 8 + fade_out + done_playback_bits=1 +} + +spectrogram_bits() +{ + add_melodic_range_spectrogram + sv-command zoom 256 + sleep 10 + zoom_in_spectrogram + sleep 20 + + if [ -n "$done_playback_bits" ]; then + sv-command setcurrent 1 + sv-command zoom out + sv-command zoom out + sv-command zoom out + sv-command zoom out + sv-command zoom out + sv-command setcurrent 2 + fi + + hide_stuff + fade_in + sleep 10 + sv-command set layer Bin-Display Frequencies + sv-command set layer Normalize-Columns on + sleep 20 + sv-command set layer Bin-Display "All Bins" + sv-command set layer Colour "Red on Blue" + sleep 10 + fade_out + sleep 1 + done_spectrogram_bits=1 + +# zoom_in_spectrogram_further +} + +onset_bits() +{ + show_stuff + sv-command setcurrent 1 + sv-command set pane Global-Zoom on + sv-command set pane Global-Scroll on + sleep 5 + sv-command zoom default + sv-command zoom in + sv-command zoom in + sv-command zoom in + sv-command add timeruler + sv-command transform vamp:vamp-aubio:aubioonset:detectionfunction + sleep 5 + sv-command set layer Plot-Type Curve + sleep 5 + sv-command setcurrent 1 + sv-command set pane Follow-Playback Page + sv-command transform vamp:vamp-aubio:aubioonset:detectionfunction + sv-command set layer Colour Red + sleep 5 + sv-command set layer Plot-Type Segmentation +# sv-command set layer Vertical-Scale "Log Scale" + sv-command jump 30 + sleep 5 +# hide_stuff + if [ -n "$done_spectrogram_bits" ]; then + sv-command setcurrent 2 + sv-command delete pane + fi + sleep 10 + sv-command setcurrent 1 1 + sv-command set layer Colour Black + sv-command setcurrent 1 2 + fade_in + sleep 5 + sv-command transform vamp:vamp-aubio:aubioonset:onsets + sv-command set layer Colour Black + sleep 20 + sv-command setcurrent 2 +# sv-command transform vamp:qm-vamp-plugins:qm-tempotracker:beats + sv-command transform vamp:vamp-aubio:aubiotempo:beats + sleep 10 + fade_out + show_stuff +} + +selection_bits() +{ +# reset + sv-command set overlays 1 + sv-command set zoomwheels 0 + sv-command setcurrent 2 + sv-command delete pane + if [ -n "$done_playback_bits" ]; then + sv-command setcurrent 1 2 + else + sv-command setcurrent 1 3 + fi + sv-command delete layer + if [ -n "$done_playback_bits" ]; then + sv-command setcurrent 1 2 + else + sv-command setcurrent 1 3 + fi + sv-command delete layer +# sv-command transform vamp:qm-vamp-plugins:qm-tempotracker:beats + sv-command transform vamp:vamp-aubio:aubiotempo:beats + sv-command setcurrent 1 2 + sv-command set layer Colour Orange + sv-command setcurrent 1 3 + sv-command resize 1024 500 + sv-command zoom default + sleep 10 + sv-command loop on + base=$((RANDOM % 100)) + sv-command select $base $base.3 + fade_in selection + sleep 12 + base=$((base + 4)) + sv-command addselect $base $base.1 + sleep 12 + base=$((base + 2)) + sv-command addselect $base $base.1 + sleep 6 + base=$((base + 2)) + sv-command addselect $base $base.3 + sleep 6 + base=$((base + 3)) + sv-command addselect $base $base.3 + sleep 6 + base=$((base + 2)) + sv-command addselect $base $base.3 + sleep 12 + sv-command set speedup -50 + sleep 14 + sv-command set speedup 50 + sleep 8 + sv-command set speedup 100 + sleep 5 + sv-command set speedup 200 + fade_out + sleep 20 + sv-command select none + sv-command setcurrent 1 3 + sv-command delete layer + sv-command setcurrent 1 2 + sv-command set layer Colour Black +} + +chromagram_bits() +{ + add_melodic_range_spectrogram + sv-command add timeruler + sv-command transform vamp:qm-vamp-plugins:qm-chromagram:chromagram + sleep 2 + sv-command jump 20 + sleep 10 + sv-command zoom out + fade_in + sleep 10 + fade_out +} + +while /bin/true; do + +sleep 2 +load_a_file +sv-command loop on + +sv-command resize 1024 500 +show_stuff +sleep 10 +playback_bits + +sv-command resize 1024 700 +show_stuff +#sleep 10 +spectrogram_bits + +sv-command jump 0 +sv-command resize 1024 700 +show_stuff +sleep 10 +onset_bits + +selection_bits + +sv-command resize 1024 700 + +sv-command jump 0 +chromagram_bits + +sleep 20 + +pid="`pidof sonic-visualiser`" +if [ -n "$pid" ]; then + kill "$pid" + sleep 2 +else + reset +fi + +done diff -r 34dc23246f46 -r e200055fe80b osc/sv-command --- a/osc/sv-command Tue Nov 14 16:06:00 2006 +0000 +++ b/osc/sv-command Wed Nov 15 18:22:26 2006 +0000 @@ -52,3 +52,4 @@ done fi +exit 0 diff -r 34dc23246f46 -r e200055fe80b transform/TransformFactory.cpp --- a/transform/TransformFactory.cpp Tue Nov 14 16:06:00 2006 +0000 +++ b/transform/TransformFactory.cpp Wed Nov 15 18:22:26 2006 +0000 @@ -623,6 +623,27 @@ return ok ? inputModel : 0; } +PluginTransform::ExecutionContext +TransformFactory::getDefaultContextForTransform(TransformName name, + Model *inputModel) +{ + PluginTransform::ExecutionContext context(-1); + + QString id = name.section(':', 0, 2); + + if (FeatureExtractionPluginFactory::instanceFor(id)) { + + Vamp::Plugin *vp = + FeatureExtractionPluginFactory::instanceFor(id)->instantiatePlugin + (id, inputModel ? inputModel->getSampleRate() : 48000); + + if (vp) context = PluginTransform::ExecutionContext(-1, vp); + + } + + return context; +} + Transform * TransformFactory::createTransform(TransformName name, Model *inputModel, const PluginTransform::ExecutionContext &context, diff -r 34dc23246f46 -r e200055fe80b transform/TransformFactory.h --- a/transform/TransformFactory.h Tue Nov 14 16:06:00 2006 +0000 +++ b/transform/TransformFactory.h Wed Nov 15 18:22:26 2006 +0000 @@ -90,6 +90,13 @@ AudioCallbackPlaySource *source = 0); /** + * Get the default execution context for the given transform + * and input model (if known). + */ + PluginTransform::ExecutionContext getDefaultContextForTransform(TransformName name, + Model *inputModel = 0); + + /** * Return the output model resulting from applying the named * transform to the given input model. The transform may still be * working in the background when the model is returned; check the