Mercurial > hg > sonic-visualiser
changeset 396:94bb597df464
Merge
author | Chris Cannam |
---|---|
date | Fri, 04 Feb 2011 14:33:16 +0000 (2011-02-04) |
parents | 065b61fe7cc3 (current diff) 53d5e31770b4 (diff) |
children | bd12bfae2d64 |
files | main/MainWindow.cpp |
diffstat | 7 files changed, 655 insertions(+), 53 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CHANGELOG Fri Feb 04 14:33:16 2011 +0000 @@ -0,0 +1,313 @@ + +Changes in Sonic Visualiser 1.8 since the previous release 1.7.2: + + - Sonic Visualiser now registers as a file type handler on OS/X, + providing better integration with the desktop generally (Dan Stowell) + + - There is a new function to toggle all Time Rulers at once (key #) + + - Text overlays are now easier to read on dark backgrounds + + - Hidden layers are now ignored when exporting an image (Dan Stowell) + + - A crash when starting a new session or exiting the application + after loading a session with saved alignment data has been fixed + + - The duplication of right-button menu functions when multiple files + were loaded has been fixed + + - The layer-add menu functions now have shortcuts (Dan Stowell) + + - The codebase has been reorganised into libraries and a configure + step added. It should be easier to build and maintain on OS/X and + Linux than previously, although it won't make much difference on + Windows. + +Changes in Sonic Visualiser 1.7.2 since the previous release 1.7.1: + + - The time-value layer now has an origin line and an option to + show derivatives (change from one point to the next) rather than + raw values + + - A static initialiser race has been fixed, possibly fixing an + occasional crash on startup in Windows + + - A crash when pressing Play straight after New Session has been + fixed + +Changes in Sonic Visualiser 1.7.1 since the previous release 1.7: + + - The RDF importer does a better job of assigning labels to layers, + layers to panes, and values to labelled regions + + - Interactive editing in the Text layer benefits from the same + improvements as made in 1.7 to Note and Region layers + + - The layer data editor window has a text search feature + + - The main window status bar now shows the last label to have passed + the playback position in the current layer, at the right end of the + status bar + + - The Russian translation has been updated (thanks Alexandre) + +Changes in Sonic Visualiser 1.7 since the previous release 1.6: + + - A new "Insert Item At Selection" function on the Edit menu + can be used to create Note and Region layer items whose time + extents correspond to the current selection(s) + + - Interactively editing points in the Note and Region layers + now works much more smoothly + + - SV can now import MIDI files that use SMPTE timecode for event + timing (importing MIDI files using with the more common + timebase-based timing was already supported) + + - Time values throughout the display may optionally be shown in + seconds and frames at various frame rates + + - A crash on exit in Windows has been fixed + + - A very unobtrusive user survey is now included + + - Various other bug fixes. + +Changes in Sonic Visualiser 1.6 since the previous release 1.5: + + - The Colour 3D Plot layer now supports logarithmic vertical + scale and linear interpolation options. + + - A new colour scheme (High Gain) has been added for spectrogram + and Colour 3D Plot, which improves readability for some data. + + - Further performance improvements have been made to Colour 3D + Plot. + + - Various other bug fixes. + +Changes in Sonic Visualiser 1.5 since the previous version 1.4: + + - You can now insert time instants, time values, and notes using + a MIDI device during playback. If a time value or note layer is + current it will be used for insertion (giving a value equal to + the pitch class, or the played note, respectively); otherwise an + existing or new time instants layer will be used just as it is + when inserting instants using the PC keyboard. Using a MIDI + device should give better timing than using the PC keyboard. + + - There is a new Activity Log window with a (purely informative) list + of events and user interactions that happen while SV is running. + + - The spectrogram has somewhat improved graphical scaling, and + this is now the default (being much faster than the 4x oversampled + method). The previous default is still available as a preference. + + - Visualisation of very dense colour plots (such as spectrograms + calculated by plugins) is substantially faster in this release. + + - Spectrogram display is now faster in many circumstances. + + - Alignment using the MATCH plugin is faster on OS/X than before. + + - SV will take into account RDF plugin descriptions, if available, + in order to make somewhat better decisions about display of plugin + outputs (for example, placing segmentation data into a layer with + segmentation plot type). + + - You can now switch layers by clicking on the spare area at the left + end of the pane that is also used for the current pane indicator. + + - The vertical black lines dividing segments in the time value + layer's segmentation plot style are now optional. + + - Several widget layout bugs on OS/X have been fixed. + + - Several serious crashing, deadlock, and data corruption bugs have + been fixed. + + +New features in Sonic Visualiser 1.4 since the previous version 1.3: + + - SV now has a Region layer type, used for display of features with + durations. It also supports Vamp v2.0 plugins that provide durations + for features. + + - Layer data can now be imported from RDF described using the Audio + Features Ontology, as well as from the existing text file types. SV + can also export annotation layer data to RDF/Turtle, although in a + somewhat simplistic manner at present. + + - You can search for transforms by text in the new "Find a Transform" + dialog. This searches both installed plugins, and plugins that have + not been installed but that have descriptions available on the + semantic web. + + - You can now zoom and scroll vertically in the time-value, note, + and colour 3d plot layers. + + - Sonic Visualiser can now load sessions from uncompressed XML files + as well as its own compressed-XML .sv format. Files with extension + .xml that contain suitable session data will be loaded as sessions. + Note that .xml extension files still do not show up in the default + file load filter. This is intentional, as there may be any kind of + data in them -- if you want to load uncompressed session files from + XML, you need to know you're doing it. + + - Several crashes and other bugs have been fixed. + +Changes in Sonic Visualiser 1.3 since the previous version 1.2: + + - There is a new spreadsheet-style data viewer and editor for + viewing and editing the data in some types of annotation layer. + + - Alignments are now saved to the session file. + + - The spectrogram layer is usually somewhat faster than it was. + + - You can now hold Shift while dragging to move an item, in order + to override the initial drag resistance introduced in 1.2. + + - The gross mis-labelling of time lines in the ruler has been fixed. + + - There is a new, somewhat provisional PulseAudio output driver. + + - Several other bug fixes. + +New features in Sonic Visualiser 1.2, since the previous version 1.0: + + - SV now supports time-alignment of multiple performances of a work + loaded at the same time. This option is enabled when the MATCH Vamp + plugin is installed. When alignment is switched on and more than one + audio file is open, SV will assume that all open files are + differently timed performances of the same work, and will calculate + time alignments for them. Playback will then play only a single file + at a time, and the playback cursors in other files will track at the + varying speeds to try to ensure that each is at the same point in the + underlying score. This enables effective comparison of several such + files, as well as a meaningful way to switch from one performance to + another during playback (ensuring that the switch happens at the + correct point in the performance being switched to). + + - There is a new Image layer, which can display images from the + local filesystem or retrieved via HTTP or FTP. + + - A new measurement tool has been added. With the measurement tool + selected, dragging in a pane draws a rectangle labelled with the + scale values for its start and end corners and its size. You can + have any number of measurements present at once; they are associated + with the top layer, their scale values depend on the scale for that + layer, and they are only shown when that layer is at the top and the + measurement tool is active. Measurements are saved and reloaded in + the session file. Drawing measurements can be undone and redone, and + a measurement can be deleted by hitting Del when highlighted. Note + that the measurement tool shows the scale values associated with the + pixel positions of the mouse when dragging, not any values associated + with actual features present in the audio or its analysis (e.g. the + values are not rounded to the nearest spectrogram bin). + + - You can double-click using the measurement tool in the spectrogram + to get an instant measurement rectangle for a feature. This is a + purely graphical feature that works by calculating the boundary of a + contiguous region of pixels "similar to" the one you double-clicked + on; it does not use audio analysis. Adjusting the gain and colour + scheme etc of the spectrogram will (by design) affect the + measurements obtained this way. + + - The spectrum can now optionally show frequency estimates of peaks + aligned with a piano keyboard along the horizontal axis (this needs + some refinement). + + - The harmonic cursor in the spectrogram has moved from the Select + tool to the Measurement tool. There is now a similar harmonic cursor + in the spectrum. Both of them show more information as text + alongside the cursor than previously. + + - There is a new Erase tool for erasing individual points from an + editable layer. + + - Several keyboard shortcuts have changed -- all of the Alt+key + shortcuts now either use Ctrl or a plain keypress with no modifier, + to avoid clashes with window manager shortcuts and to make them + easier to use and remember + + - The playback controls are now in a Playback menu as well as the + toolbar. + + - There is a new key and mouse control reference under Help (or press + F2). + + - You can double-click on a pane in navigate mode to jump to a time. + + - All of the single-colour layers (waveform, time values etc) now + allow you to define your own colours as well as using the built-in + set. The colour of a layer is now shown next to its name on the pane. + + - When you add a new single-colour layer it will use a default colour + that is not yet in use in another layer (if there is one). + + - Single-colour layers can now optionally have black backgrounds (with + a set of lighter colours in the default colour palette that use black + backgrounds by default). + + - There's a new Printer colour scheme in the spectrogram with only a + small number of grey shades. + + - Vertical zoom in a log-scaled spectrogram is much more intuitive; + it now leaves the point that was in the centre of the visible area in + the centre after zoom, instead of the point that was in the centre of + the linear range corresponding to the visible area. + + - You can now turn a colour 3d plot layer upside down by clicking the + Invert Vertical Scale button. + + - There's a new Layer Summary window which shows the panes and + layer data in a tree layout. This is very simplistic at the moment. + + - Each pane now has an [X] button at its top left, which removes that + pane when clicked. + + - There's a new Solo play mode toggle button; when active, only the + currently selected pane is played. This is also the default when + time alignment is in use. + + - Rewind/ffwd now stay confined to the selection if Play Selection is + enabled; also, the rewind and ffwd "one step" buttons are now enabled + even if there is no time instants layer for them to align to (they + align to the time ruler instead and so jump in steps of a size + dependent on the zoom level). + + - You can now export note layers to MIDI. + + - MIDI note velocity is partially supported. Note velocity is + retained when importing and exporting MIDI and is used in playback, + but it is not yet shown in the display and cannot yet be edited. + + - You can now drag-and-drop files (of whatever type) onto SV from + other programs such as file managers or web browsers. + + - mp3 files (and Ogg, but they aren't supported on Windows at the + moment) are now decoded in a background thread so you can see the + start of the track without waiting for the rest to decode. + + - Mac builds of SV can now load AAC/mp4 files and anything else + supported by QuickTime. + + - There is now an option to resample audio files on import if they + don't match the samplerate of the first file loaded. By default this + is switched off, as it affects the visible waveform. The default + behaviour is unchanged (play at the wrong rate). There is still no + option to handle multiple rates "correctly" (i.e. by resampling + on playback and showing the waveforms at different resolutions + according to each one's underlying rate) and there probably never + will be. + + - SV can now open .m3u playlist files, though it's a hazardous thing + to do as it simply loads all the files in the playlist at once. + + - SV now has various options for how to number tapped time instants + (bar/beat, plain counter, time in seconds, tempo etc). + + - The official builds use Qt 4.3, which fixes some nasty + bugs in the file dialog that the version 1.0 builds suffered from. +
--- a/INSTALL.txt Fri Feb 04 14:33:07 2011 +0000 +++ b/INSTALL.txt Fri Feb 04 14:33:16 2011 +0000 @@ -2,12 +2,7 @@ To compile from source ---------------------- -This file provides various instructions useful when compiling the SV -libraries from source, but it doesn't have a complete recipe for any -one platform -- there are too many variables. However, you can find a -recipe for one platform (Ubuntu Linux) in the file INSTALL.ubuntu. - -To build, run +To build on a Unix-like system, run $ ./configure && make
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README Fri Feb 04 14:33:16 2011 +0000 @@ -0,0 +1,113 @@ + +Sonic Visualiser +================ + +Sonic Visualiser is a program for viewing and analysing the contents +of music audio files. + +With Sonic Visualiser you can: + + * Load audio files in various formats (WAV/AIFF, plus Ogg and mp3 +if compiled in) and view their waveforms + + * Look at audio visualisations such as spectrogram views, with +interactive adjustment of display parameters + + * Annotate audio data by adding labelled time points and defining +segments, point values and curves + + * Run feature-extraction plugins to calculate annotations +automatically, using algorithms such as beat trackers, pitch +detectors and so on + + * Import annotation data from various text formats and MIDI files + + * Play back the original audio with synthesised annotations, taking +care to synchronise playback with the display position + + * Slow down and speed up playback and loop segments of interest, +including seamless looping of complex non-contiguous areas + + * Export annotations and audio selections to external files. + +Sonic Visualiser can also be controlled remotely using the Open Sound +Control (OSC) protocol (if support is compiled in). + + +Credits +------- + +Sonic Visualiser was developed at the Centre for Digital Music, +Queen Mary, University of London. + + http://www.elec.qmul.ac.uk/digitalmusic/ + +The main program is by Chris Cannam, with additional DSP and program +design work by Christian Landone. Thanks also to Craig Sapp for his +suggestions and useful feedback. + +Code copyright 2005-2007 Chris Cannam and copyright 2006-2011 Queen +Mary, University of London, except where indicated in the individual +source files. + +This work was partially funded by the European Commission through the +SIMAC project IST-FP6-507142 and the EASAIER project IST-FP6-033902. + +This work was partially funded by the Arts and Humanities Research +Council through its Research Centre for the History and Analysis of +Recorded Music (CHARM). + +This work was partially funded by the Engineering and Physical +Sciences Research Council through the OMRAS2 project EP/E017614/1. + +This work was partially funded by the Engineering and Physical +Sciences Research Council through the Musicology for the Masses +project EP/I001832/1. + +Sonic Visualiser is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or (at +your option) any later version. See the file COPYING included with +this distribution for more information. + +Sonic Visualiser may also make use of the following libraries: + + * Qt4 -- Copyright Nokia Corporation, distributed under the Lesser GPL + * JACK -- Copyright Paul Davis, Jack O'Quin et al, under the Lesser GPL + * PortAudio -- Copyright Ross Bencina, Phil Burk et al, BSD license + * Ogg decoder -- Copyright CSIRO Australia, BSD license + * MAD mp3 decoder -- Copyright Underbit Technologies Inc, GPL + * libsamplerate -- Copyright Erik de Castro Lopo, GPL + * libsndfile -- Copyright Erik de Castro Lopo, LGPL + * FFTW3 -- Copyright Matteo Frigo and MIT, GPL + * Rubber Band -- Copyright Chris Cannam, GPL + * Vamp plugin SDK -- Copyright Chris Cannam, BSD license + * LADSPA plugin SDK -- Copyright Richard Furse et al, LGPL + * Redland RDF libraries -- Copyright Dave Beckett and the University of Bristol, LGPL/Apache license + * RtMIDI -- Copyright Gary P. Scavone, BSD license + * liblo OSC library -- Copyright Steve Harris, GPL + +(Some distributions of Sonic Visualiser may have one or more of these +libraries statically linked.) Many thanks to their authors. + +Sonic Visualiser can also use QuickTime for audio file import on OS/X. +For licensing reasons, you may not distribute binaries of Sonic +Visualiser with QuickTime support included for any platform that does +not include QuickTime as part of the platform itself (see section 3 of +version 2 of the GNU General Public License). + + +Compiling Sonic Visualiser +-------------------------- + +If you are planning to compile Sonic Visualiser from source code, +please read the file INSTALL.txt. + + +More information +---------------- + +For more information about Sonic Visualiser, please go to + + http://www.sonicvisualiser.org/ +
--- a/main/MainWindow.cpp Fri Feb 04 14:33:07 2011 +0000 +++ b/main/MainWindow.cpp Fri Feb 04 14:33:16 2011 +0000 @@ -4094,7 +4094,7 @@ #endif aboutText += - "<p><small>Sonic Visualiser Copyright © 2005–2010 Chris Cannam and " + "<p><small>Sonic Visualiser Copyright © 2005–2011 Chris Cannam and " "Queen Mary, University of London.</small></p>" "<p><small>This program is free software; you can redistribute it and/or " "modify it under the terms of the GNU General Public License as "
--- a/main/main.cpp Fri Feb 04 14:33:07 2011 +0000 +++ b/main/main.cpp Fri Feb 04 14:33:16 2011 +0000 @@ -36,6 +36,7 @@ #include <QSplashScreen> #include <QTimer> #include <QPainter> +#include <QFileOpenEvent> #include "../version.h" @@ -188,7 +189,10 @@ public: SVApplication(int &argc, char **argv) : QApplication(argc, argv), - m_mainWindow(0) { } + m_readyForFiles(false), + m_filepathQueue(QStringList()), + m_mainWindow(0) + { } virtual ~SVApplication() { } void setMainWindow(MainWindow *mw) { m_mainWindow = mw; } @@ -202,8 +206,15 @@ if (!success) manager.cancel(); } + void handleFilepathArgument(QString path, QSplashScreen *splash); + + bool m_readyForFiles; + QStringList m_filepathQueue; + protected: MainWindow *m_mainWindow; + bool event(QEvent *); + }; int @@ -347,59 +358,21 @@ // complete. As a lazy hack, apply it explicitly from here gui->preferenceChanged("Property Box Layout"); - bool haveSession = false; - bool haveMainModel = false; - bool havePriorCommandLineModel = false; + application.m_readyForFiles = true; // Ready to receive files from e.g. Apple Events for (QStringList::iterator i = args.begin(); i != args.end(); ++i) { - MainWindow::FileOpenStatus status = MainWindow::FileOpenFailed; - if (i == args.begin()) continue; if (i->startsWith('-')) continue; QString path = *i; - if (path.endsWith("sv")) { - if (!haveSession) { - status = gui->openSessionFile(path); - if (status == MainWindow::FileOpenSucceeded) { - haveSession = true; - haveMainModel = true; - } - } else { - std::cerr << "WARNING: Ignoring additional session file argument \"" << path.toStdString() << "\"" << std::endl; - status = MainWindow::FileOpenSucceeded; - } - } - if (status != MainWindow::FileOpenSucceeded) { - if (!haveMainModel) { - status = gui->open(path, MainWindow::ReplaceMainModel); - if (status == MainWindow::FileOpenSucceeded) { - haveMainModel = true; - } - } else { - if (haveSession && !havePriorCommandLineModel) { - status = gui->open(path, MainWindow::AskUser); - if (status == MainWindow::FileOpenSucceeded) { - havePriorCommandLineModel = true; - } - } else { - status = gui->open(path, MainWindow::CreateAdditionalModel); - } - } - } - if (status == MainWindow::FileOpenFailed) { - if (splash) splash->hide(); - QMessageBox::critical - (gui, QMessageBox::tr("Failed to open file"), - QMessageBox::tr("File or URL \"%1\" could not be opened").arg(path)); - } else if (status == MainWindow::FileOpenWrongMode) { - if (splash) splash->hide(); - QMessageBox::critical - (gui, QMessageBox::tr("Failed to open file"), - QMessageBox::tr("<b>Audio required</b><p>Please load at least one audio file before importing annotation data")); - } + application.handleFilepathArgument(path, splash); + } + + for (QStringList::iterator i = application.m_filepathQueue.begin(); i != application.m_filepathQueue.end(); ++i) { + QString path = *i; + application.handleFilepathArgument(path, splash); } #ifdef HAVE_FFTW3F @@ -457,3 +430,68 @@ return rv; } + +bool SVApplication::event(QEvent *event){ + QString thePath; + switch (event->type()) { + case QEvent::FileOpen: + thePath = static_cast<QFileOpenEvent *>(event)->file(); + if(m_readyForFiles) + handleFilepathArgument(thePath, NULL); + else + m_filepathQueue.append(thePath); + return true; + default: + return QApplication::event(event); + } +} + +/** Application-global handler for filepaths passed in, e.g. as command-line arguments or apple events */ +void SVApplication::handleFilepathArgument(QString path, QSplashScreen *splash){ + static bool haveSession = false; + static bool haveMainModel = false; + static bool havePriorCommandLineModel = false; + + MainWindow::FileOpenStatus status = MainWindow::FileOpenFailed; + + if (path.endsWith("sv")) { + if (!haveSession) { + status = m_mainWindow->openSessionFile(path); + if (status == MainWindow::FileOpenSucceeded) { + haveSession = true; + haveMainModel = true; + } + } else { + std::cerr << "WARNING: Ignoring additional session file argument \"" << path.toStdString() << "\"" << std::endl; + status = MainWindow::FileOpenSucceeded; + } + } + if (status != MainWindow::FileOpenSucceeded) { + if (!haveMainModel) { + status = m_mainWindow->open(path, MainWindow::ReplaceMainModel); + if (status == MainWindow::FileOpenSucceeded) { + haveMainModel = true; + } + } else { + if (haveSession && !havePriorCommandLineModel) { + status = m_mainWindow->open(path, MainWindow::AskUser); + if (status == MainWindow::FileOpenSucceeded) { + havePriorCommandLineModel = true; + } + } else { + status = m_mainWindow->open(path, MainWindow::CreateAdditionalModel); + } + } + } + if (status == MainWindow::FileOpenFailed) { + if (splash) splash->hide(); + QMessageBox::critical + (m_mainWindow, QMessageBox::tr("Failed to open file"), + QMessageBox::tr("File or URL \"%1\" could not be opened").arg(path)); + } else if (status == MainWindow::FileOpenWrongMode) { + if (splash) splash->hide(); + QMessageBox::critical + (m_mainWindow, QMessageBox::tr("Failed to open file"), + QMessageBox::tr("<b>Audio required</b><p>Please load at least one audio file before importing annotation data")); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/osx/Info.plist Fri Feb 04 14:33:16 2011 +0000 @@ -0,0 +1,141 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd"> +<plist version="0.9"> +<dict> + <key>CFBundleIconFile</key> + <string>sv-macicon.icns</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleGetInfoString</key> + <string>Created by Qt/QMake</string> + <key>CFBundleSignature</key> + <string>SNCV</string> + <key>CFBundleExecutable</key> + <string>Sonic Visualiser</string> + <key>CFBundleIdentifier</key> + <string>org.isophonics.SonicVisualiser</string> + <key>CFBundleDocumentTypes</key> + <array> + <!-- we are an 'editor' of SV files --> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>sv</string> + </array> + <!-- TODO + <key>CFBundleTypeIconFile</key> + <string>SVProject.icns</string> --> + <key>CFBundleTypeMIMETypes</key> + <array> + <string>application/x-sonic-visualiser-project</string> + </array> + <key>CFBundleTypeName</key> + <string>Sonic Visualiser Project</string> + <key>CFBundleTypeOSTypes</key> + <array> + <string>****</string> + </array> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>LSHandlerRank</key> + <string>Owner</string> + <key>LSIsAppleDefaultForType</key> + <true/> + </dict> + + <!-- we are a 'viewer' of general audio files --> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>mp3</string> + </array> + <key>CFBundleTypeMIMETypes</key> + <array> + <string>audio/mpeg</string> + </array> + <key>CFBundleTypeName</key> + <string>MP3 Audio</string> + <key>CFBundleTypeRole</key> + <string>Viewer</string> + <key>LSIsAppleDefaultForType</key> + <false/> + <key>LSHandlerRank</key> + <string>Alternate</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>ogg</string> + <string>oga</string> + </array> + <key>CFBundleTypeMIMETypes</key> + <array> + <string>audio/ogg</string> + </array> + <key>CFBundleTypeName</key> + <string>Ogg Vorbis Audio</string> + <key>CFBundleTypeRole</key> + <string>Viewer</string> + <key>LSIsAppleDefaultForType</key> + <false/> + <key>LSHandlerRank</key> + <string>Alternate</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>wav</string> + </array> + <key>CFBundleTypeMIMETypes</key> + <array> + <string>audio/x-wav</string> + </array> + <key>CFBundleTypeName</key> + <string>Wave Audio</string> + <key>CFBundleTypeRole</key> + <string>Viewer</string> + <key>LSIsAppleDefaultForType</key> + <false/> + <key>LSHandlerRank</key> + <string>Alternate</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>aif</string> + <string>aiff</string> + </array> + <key>CFBundleTypeMIMETypes</key> + <array> + <string>audio/x-aiff</string> + </array> + <key>CFBundleTypeName</key> + <string>AIFF Audio</string> + <key>CFBundleTypeRole</key> + <string>Viewer</string> + <key>LSIsAppleDefaultForType</key> + <false/> + <key>LSHandlerRank</key> + <string>Alternate</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>flac</string> + </array> + <key>CFBundleTypeMIMETypes</key> + <array> + <string>audio/flac</string> + </array> + <key>CFBundleTypeName</key> + <string>FLAC Audio</string> + <key>CFBundleTypeRole</key> + <string>Viewer</string> + <key>LSIsAppleDefaultForType</key> + <false/> + <key>LSHandlerRank</key> + <string>Alternate</string> + </dict> + </array> + </dict> +</plist>