scide: implement selectionLength for openDocument
[supercollider.git] / HelpSource / Classes / SoundFileView.schelp
blobcb0f23368896353aba5b774be9807587b732ea8a
1 class:: SoundFileView
2 redirect:: implClass
3 summary:: Sound file display
4 categories:: GUI>Views
5 related:: Classes/SoundFile
8 DESCRIPTION::
10 A sound file viewer with numerous options.
12 In strong::Qt GUI:: you can strong::zoom:: in and out using Shift + right-click + mouse-up/down; likewise, you can strong::scroll:: using right-click + mouse-left/right.
14 CLASSMETHODS::
16 PRIVATE:: key
19 INSTANCEMETHODS::
21 SUBSECTION:: Data
23 METHOD:: soundfile
25     argument::
26         An Instance of SoundFile to display.
29 METHOD:: read
31     Reads a section of the link::#-soundfile:: and displays it in the view. For large files, you may want to use readWithTask instead.
33     note:: In Qt GUI, the 'block' argument has no effect; the display resolution is infinite. ::
35     argument:: startFrame
36         The beginning of the section, in frames.
38     argument:: frames
39         The size of the section, in frames.
41     argument:: block
42         The block size - visual resolution of the display. An Integer of the form 2**n.
44     argument:: closeFile
45         If true, closes the SoundFile after reading.
48 METHOD:: readFile
50     Reads a section of an open instance of SoundFile, and displays it in the view. For large files, you may want to use the method readWithTask instead.
52     note:: In Qt GUI, the 'block' argument has no effect; the display resolution is infinite. ::
54     argument:: soundfile
55         An open instance of SoundFile.
57     argument:: startFrame
58         The beginning of the section, in frames.
60     argument:: frames
61         The size of the section, in frames.
63     argument:: block
64         The block size - visual resolution of the display. An Integer of the form 2**n.
66     argument:: closeFile
67         If true, closes the SoundFile after reading.
69 METHOD:: readWithTask
71     Reads a section of the link::#-soundfile:: asynchronously (in the background), updating the link::#-readProgress:: along the way. If the code::showProgress:: argument is code::true::, a SoundFileViewProgressWindow opens to show the progress.
73     note:: In Qt GUI:
74         The 'block' argument has no effect; the display resolution is infinite.
75         The 'showProgress' argument has no effect; the view always displays reading progress within itself.
76     ::
78     argument:: startFrame
79         The beginning of the section, in frames.
81     argument:: frames
82         The size of the section, in frames.
84     argument:: block
85         The block size - visual resolution of the display. An Integer of the form 2**n.
87     argument:: doneAction
88         An optional function to be evaluated on completion.
90     argument:: showProgress
91         Whether to open a progress window. Defaults to code::true::.
94 METHOD:: readFileWithTask
96     Reads a section of an open instance of SoundFile asynchronously (in the background), updating the link::#-readProgress:: along the way. If the code::showProgress:: argument is code::true::, a SoundFileViewProgressWindow opens to show the progress.
98     note:: In Qt GUI:
99         The 'block' argument has no effect; the display resolution is infinite.
100         The 'showProgress' argument has no effect; the view always displays reading progress within itself.
101     ::
103     argument:: soundfile
104         An open instance of SoundFile.
106     argument:: startFrame
107         The beginning of the section, in frames.
109     argument:: frames
110         The size of the section, in frames.
112     argument:: block
113         The block size - visual resolution of the display. An Integer of the form 2**n.
115     argument:: doneAction
116         An optional function to be evaluated on completion.
118     argument:: showProgress
119         Whether to open a progress window. Defaults to code::true::.
121 METHOD:: data
123     Gets the display data, or sets custom data instead of a sound file.
125     note:: In Qt and SwingOSC it is not possible to get the data. ::
127     In Cocoa and SwingOSC, setting this property is equivalent to link::#-setData:: with number of channels and sample rate of the current link::#-soundfile:: (if any), while in Qt it always assumes 1 channel and sample rate of 44100 Hz. Use link::#-setData:: instead if you want more control.
129     argument::
130         An Array of Floats; multiple channel data should be interleaved.
132 METHOD:: setData
134     Sets custom display data instead of a sound file, interpreting it using specified number of channels and sample rate.
136     note:: In Qt GUI, the 'block' argument has no effect; the display resolution is infinite. ::
138     argument:: arr
139         An Array of Floats; multiple channel data should be interleaved.
141     argument:: block
142         The block size - visual resolution of the display. An Integer of the form 2**n.
144     argument:: startframe
145         An integer.
147     argument:: channels
148         An integer.
150     argument:: samplerate
151         An integer.
153 METHOD:: alloc
154     NOTE:: Only in Qt GUI ::
155     Allocates a desired amount of display channels and frames; all frames have initial value of 0.
156     argument:: frames
157         An Integer.
158     argument:: channels
159         An Integer.
160     argument:: samplerate
161         An Integer.
163 METHOD:: set
164     NOTE:: Only in Qt GUI ::
165     Overwrites a range of display data with another data. This method can be used after link::#-alloc:: or link::#-setData:: has been called, but not while the view is displaying a sound file.
167     argument:: offset
168         The frame at which to start overwriting; an Integer.
169     argument:: data
170         The new data; an Array of Floats; multiple channel data should be interleaved.
172 METHOD:: startFrame
174     The beginning of the read section of the soundfile, or 0 if link::#-alloc:: or link::#-setData:: has been used.
176 METHOD:: numFrames
178     The total amount of frames in the view; this is unrelated to link::#-zoom#zooming:: and link::#-scroll#scrolling::.
180 METHOD:: readProgress
182      The reading progress, updated periodically when reading a soundfile using link::#-readWithTask:: or link::#-readFileWithTask::.
184 SUBSECTION:: Navigation
186 METHOD:: viewFrames
188     The amount of currently visible frames in the view.
190 METHOD:: zoom
192     Zooms by a factor relative to current zoom.
194     argument::
195         A Float.
197 METHOD:: zoomToFrac
199     Zooms to a specific scale.
201     argument::
202         A Float.
204 METHOD:: zoomAllOut
206     Zooms to the link::#-currentSelection#current selection::.
208 METHOD:: zoomSelection
210     Zooms to a specific selection.
212     argument::
213         The index of the selection; an Integer between 0 an 63.
215 METHOD:: scrollPos
217     The scrolling position of the view, as a fraction of the total scrolling range.
219     returns::
220         A Float in the range of 0.0 to 1.0.
222 METHOD:: scrollTo
224     Scrolls to a fraction of the total scrolling range.
226     argument::
227         A Float in the range of 0.0 to 1.0.
229 METHOD:: scroll
231     Scrolls by a fraction of the visible range.
233     argument::
234         A Float.
236 METHOD:: scrollToStart
238     Scrolls to the beginning.
240 METHOD:: scrollToEnd
242     Scrolls to the end.
245 SUBSECTION:: Selection
247 METHOD:: selections
249     All the selections.
251     returns:: An array of 64 arrays of start frames and sizes: [ [ start0, size0 ] , [ start1, size1 ], ... ].
253 METHOD:: selection
255     The selection at index.
257     returns::
258         An Array of the form code::[start, size]::, where start and size denote frames.
260 METHOD:: setSelection
262     Sets the selection at index.
264     argument:: index
265         An Integer between 0 an 63.
267     argument:: selection
268         An Array of the form code::[start, size]::, where start and size are Integers and denote frames.
270 METHOD:: currentSelection
272     The index of the current selection
274     argument::
275         An integer between 0 an 63.
277 METHOD:: selectionStart
279     The start frame of a selection.
281     argument:: index
282         The index of the selection; an Integer between 0 an 63.
284     returns::
285         An Integer.
287 METHOD:: setSelectionStart
289     Sets the start frame of a selection.
291     argument:: index
292         The index of the selection; an Integer between 0 an 63.
294     argument:: frame
295         The starting frame of the selection, an Integer.
297 METHOD:: selectionSize
299     The size of a selection.
301     argument:: index
302         The index of the selection; an Integer between 0 an 63.
304     returns::
305         An Integer.
307 METHOD:: setSelectionSize
309     Sets the size of a selection.
311     argument:: index
312         The index of the selection; an Integer between 0 an 63.
314     argument:: frames
315         The size in frames of the selection, an Integer.
317 METHOD:: selectionStartTime
319     The start of a selection in seconds.
321     argument:: index
322         The index of the selection; an Integer between 0 an 63.
324     returns::
325         A Float.
327 METHOD:: selectionDuration
329     The size of a selection in seconds.
331     argument:: index
332         The index of the selection; an Integer between 0 an 63.
334     returns::
335         A Float.
337 METHOD:: selectAll
339     Sets a selection to span the whole data range.
341     argument:: index
342         The index of the selection; an Integer between 0 an 63.
345 METHOD:: selectNone
347     Sets the size of a selectino to 0.
349     argument:: index
350         The index of the selection; an Integer between 0 an 63.
352 METHOD:: setSelectionColor
354     Sets the color of a selection.
356     argument:: index
357         The index of the selection; an Integer between 0 an 63.
359     argument:: color
360         A Color.
362 METHOD:: setEditableSelectionStart
364     Sets whether the start point of a selection can be edited.
366     argument:: index
367         The index of the selection; an Integer between 0 an 63.
369     argument:: editable
370         A Boolean.
372 METHOD:: setEditableSelectionSize
374     Whether the end point of a selection can be edited.
376     argument:: index
377         The index of the selection; an Integer between 0 an 63.
379     argument:: editable
380         A Boolean.
382 METHOD:: readSelection
384     note:: Not in Qt GUI ::
386     Read the data within a selection.
388     argument:: block
389         The block size - visual resolution of the display. An Integer of the form 2**n.
391     argument:: closeFile
392         If true, closes the SoundFile after reading.
394 METHOD:: readSelectionWithTask
396     note:: Not in Qt GUI ::
398     Read the data within the current selection asynchronously (in the background), showing the progress in a separate window.
401 SUBSECTION:: Display
403 METHOD:: gridOn
405     Whether the grid is displayed. Defaults to code::true::.
407     argument::
408         A Boolean.
410 METHOD:: gridResolution
412     The resolution of the grid.
414     argument::
415         An instance of Float.
417 METHOD:: gridOffset
419     Sets the grid offset.
421     argument::
422         An integer.
424 METHOD:: gridColor
426     The color of the grid.
428     argument::
429         A Color.
431 METHOD:: drawsWaveForm
433     Whether the data is displayed. Defaults to code::true::.
435     argument::
436         A Boolean.
438 METHOD:: timeCursorOn
440     Whether the time cursor is displayed. Defaults to code::false::.
442     argument::
443         A Boolean.
445 METHOD:: timeCursorPosition
447     The position of the time cursor in frames.
449     argument::
450         An Integer.
452 METHOD:: timeCursorColor
454     The color of the time cursor.
456     argument::
457         A Color.
459 METHOD:: elasticMode
461     ???
463 SUBSECTION:: Actions
465 METHOD:: action
467     The object to be evaluated whenever the user interacts with the view.
469 METHOD:: metaAction
471     The object to be evaluated on Ctrl + click.
474 EXAMPLES::
476 SUBSECTION:: Basic example
478 code::
479 // In Qt GUI:
480 // To zoom in/out: Shift + right-click + mouse-up/down
481 // To scroll: right-click + mouse-left/right
483 w = Window.new("soundfile test", Rect(200, 300, 740, 100));
484 a = SoundFileView.new(w, Rect(20,20, 700, 60));
486 f = SoundFile.new;
487 f.openRead(Platform.resourceDir +/+ "sounds/a11wlk01.wav");
488 f.inspect;
490 a.soundfile = f;
491 a.read(0, f.numFrames);
492 a.elasticMode = true;
494 a.timeCursorOn = true;
495 a.timeCursorColor = Color.red;
496 a.timeCursorPosition = 2050;
497 a.drawsWaveForm = true;
498 a.gridOn = true;
499 a.gridResolution = 0.2;
501 w.front;
505 SUBSECTION:: Step by step examples
507 code::
508 ( // make a simple SoundFileView
509 y = Window.screenBounds.height - 120;
510 w = Window.new("soundfile test", Rect(200, y, 740, 100)).alwaysOnTop_(true);
511 w.front;
512 a = SoundFileView.new(w, Rect(20,20, 700, 60));
514 f = SoundFile.new;
515 f.openRead(Platform.resourceDir +/+ "sounds/a11wlk01.wav");
516 // f.inspect;
518 a.soundfile = f;            // set soundfile
519 a.read(0, f.numFrames);     // read in the entire file.
520 a.refresh;                  // refresh to display the file.
523 // In Qt GUI:
524 // To zoom in/out: Shift + right-click + mouse-up/down
525 // To scroll: right-click + mouse-left/right
527 // reading file
528 a.read(0, f.numFrames / 2).refresh; // read first half
529 a.read.refresh;                     // read entire file by default
530 a.read(f.numFrames / 2).refresh;    // read second half
531 a.read(0, -1).refresh;              // -1 also reads entire file, like buffer.
533 // In Qt GUI, the resolution of the view is always infinite;
534 // you can always zoom in until you see a single sample.
536 // In other GUI kits, 'block' sets the resolution of the view (default is 64).
537 // i.e. the view keeps peak values for each block of e.g. 64 samples
538 // rather than the entire waveform.
539 a.read(0, -1, block: 32).refresh;
540 a.read(0, -1, block: 24).refresh;
541 a.read(0, -1, block: 16).refresh;
543 // for longer files, you can use:
544 a.readWithTask;
546 // zoom is relative
547 a.zoom(0.2).refresh;
548 a.zoom(2).refresh;
549 a.zoom(2).refresh;
550 a.zoomToFrac(0.5); // zoom to half file size
551 a.zoomAllOut;
553 a.gridOn = true;            // time grid, 1 second by default,
554 a.gridResolution = 0.2;     // or set resolution in seconds
555 a.gridColor = Color.cyan;   // color is changeable.
556 a.gridOffset_(0.1);         // not sure if this is working?
558 a.timeCursorOn = true;          // a settable cursor
559 a.timeCursorPosition = 2050;    // position is in frames.
560 a.timeCursorColor = Color.white;
562 // toggle drawing on/off
563 a.drawsWaveForm = false;
564 a.drawsWaveForm = true;
566 // these methods should return view properties:
567 a.gridOn
568 a.gridResolution
569 a.gridColor
570 a.timeCursorOn
571 a.timeCursorPosition
572 a.timeCursorColor
574 // Selections: multiple selections are supported.
575 // e.g. use selection 0:
576 a.setSelectionColor(0, Color.red);  // set...( index, value )
577 a.selectionStart(0);                // at index
578 a.setSelectionStart(0, 12345);
579 a.setSelectionSize(0, 12345);
581 a.setSelectionStart(0, 1234);
582 a.selectionStart(0);
584 // now selection 1
585 a.setSelectionColor(1, Color.white);
586 a.setSelectionStart(1, 1234).setSelectionSize(1, 1234 * 2);
587 a.selectionStart(1);
588 a.setSelectionStart(0, 12345);
590 // the current selection gets changed when click/dragging in view.
591 a.currentSelection;     // index of current selection;
592 a.currentSelection_(1); // switch current selection - try click/drag white now.
593 a.currentSelection;
595 a.selections.size;      // 64 selections
596 a.selections[0];
597 a.selections[1];
598 a.selections;
600 // setSelection (index, selection);
601 a.setSelection(0, [234, 2345]);
602 a.selection(1); // returns [start, size].
605 a.elasticMode = true;   // not sure if this is working yet?
607 (       // mouseUpAction
608 a.mouseUpAction = {
609     ("mouseUp, current selection is now:"
610         + a.selections[a.currentSelection]).postln;
613 // lock selection 0:
614 a.currentSelection_(0);
615 a.setEditableSelectionStart(0, false);
616 a.setEditableSelectionSize(0, false);
619 // unlock selection 0:
620 a.setEditableSelectionStart(0, true);
621 a.setEditableSelectionSize(0, true);
623 a.selectionStartTime(0);
624 a.selectionDuration(0);
627 a.setSelectionStart(0, 12345);
628 a.setSelectionSize(0, 12345);
629 a.readSelection.refresh;
630 a.readSelection(16).refresh;    // in higher resolution
631 a.read.refresh;                 // go back to entire file.
634 a.dataNumSamples;   // visual data have this many points
635 a.data.plot;
636 a.setData(a.data.reverse);
639 a.zoom(0.25);       // scrolling is normalized
640 a.scrollTo(0.5);    //
641 a.scrollTo(0.6);    //
642 a.scroll(12);       // scroll is in viewFrames.
644 a.zoom(4);
646 w.close;