Auto-DJ description Version .2: June 29 2004: Updated several items: 1) Clarified/modified the usecase for how new scheduled events can be created. The previous suggestion was too complex when it came to adding new events, and did not have a usable usecase for editing the tracks in existing events. The new proposal allows events to be scheduled in a manner similar to how playlists are constructed, while schedule details are set in a manner similar to how outlook recurring appointments are set. The new proposal more explicitly shows unscheduled blocks of time. 2) Added ability to select Tracks or nodes (in addition to playlists) for scheduling. Otherwise there are too many steps as the user has to needlessly create playlists. 3) Clarified usecase for how tracks/playlists are added to an event via d&d 4) Added dependency on ability to query playlist membership for autoplaylists. This is needed to enable the user to combine autoplaylist rules with playlists (e.g. skip to skip tracks from the playlist if it was played recently) 5) Added usescases describing how various event types can be scheduled 6) Added indicator to notify the user that an event is scheduled This bug describes a feature set that can be implemented as a plugin. It can function as an Alarm, or as an automated DJ for a party or radio station. It supercedes features described in #829 (auto-play) and #470 (alarm). To be fully functional, it is dependent upon the implementation of many other features in MM (see additional information), however, it can even be useful, though less so, with MediaMonkey's current feature set. The primary objectives of the feature are: 1) Alarm: must be simple to configure MM to fade in music at any particular time on any particular set of days. It should be a 2-3 step intuitive operation. 2) Allow MediaMonkey to suppress silence i.e. to automatically play 'something' when the Now Playing list has run out OR the Now Playing list contains nothing in it and the user presses Play. 3) Allow a Pro version of MediaMonkey to be sold that allows for sophisticated scheduling. .i Support for scheduled Jingles/Ads (prioritized) .ii Display scheduled events .iii Ability to set weights on playlists (e.g. all tracks in playlist A on heavy rotation) Note: Manual (unscheduled) Jingles/Ads should also be playable in some manner, however, this will be treated as a separate feature (that would also be part of the Pro version). Description of Implementation: ------------------------------ a) The functionality should be accessible by: Pressing any of the following buttons which would lead to the appearance of the Auto-DJ dialog: -An alarm/schedule button on the advanced toolbar -Main Menu - View: Auto-DJ (toggle) -Selecting the plugin and pressing 'Configure' If the user right clicks on 'Send to: Scheduled Event' (this entry should be on the context Send-to context menus), then the Scheduler opens up in edit mode (section c) with the selected track/node/playlist having automatically been added to the edit dialog. Note that this works only works when a _single_ item (track/node/playlist) is selected. If the user enables Play: Auto-DJ, then events that have been scheduled will play (regardless of whether or not the Scheduled Events dialog appears). b) Auto-DJ must be localizable in the same manner as MediaMonkey is (i.e. using .pot file bundled with the installer & configured via the General|Language option) c) It would be nice to utilize MediaMonkey themes within the plugin. This can only be done if some level of support for this is added to the main app. d) The dialog should have its own Auto-DJ entry on the toolbar so that the user can control whether it or the MediaMonkey main panel is on top. e) View: Auto DJ |-------------------------| | Auto-DJ | Right-click anywhere --> context menu entry (Close, Delete, Options) |-------------------------| | <- June 2004 -> | | 1 2 3 4 5 6 7 | Selected date is highlighted as in outlook. | 8 9 10 11 12 13 14 | Todays date is highlighted as in outlook. | 15 16 17 18 19 20 21 | Days with scheduled events are in bold. | ... | |-------------------------| |12:00 Late Night Rock | | [x] R - P2 | Checkbox is used to activate/deactivate scheduled events. |-------------------------| As described later, inactive events are greyed out. | 1:00 Late Night Rock | | [x] R - P2 | |-------------------------| | 2:00 Late Night Rock | | [x] R - P2 | |-------------------------| | 3:00 Default AutoPlay | | [x] R - P3 | |-------------------------| | 4:00 Default AutoPlay | | [x] R - P3 | |-------------------------| | 5:00 Early Risers Show | | [x] R - P2 | |-------------------------| ... This dialog provides a simple means to: i) view schedule status at any time ii) make minor schedule changes via drag and drop iii) make detailed schedule changes by double-clicking an entry In terms of viewing schedules: It works in a manner similar to Outlook: Default timeslots are every hour on the hour, though the user has the ability to edit the default times to any hours:minute combination via the edit event dialog. Events appear as follows: -enabled scheduled events: black -disabled scheduled events: greyed out -currently occuring event: green -event scheduled to occur next: flashes green Low priority events do not appear unless Normal or High priority events aren't scheduled. Icons are used to communicate aspects re. the event: -repeating event: shows events that occur more than once -Priority: three icons are used for each of P1 (High), P2 (Normal), P3 (low) To create a scheduled event when the dialog is shown: user drags a node/track/playlist into an emply slot and double-clicks the slot to edit the details. To edit/delete a scheduled event: -user can double clicks the event to go to the Edit event dialog. -user can drag and drop a track/node/playlist into the scheduled event to replace the existing track/node/playlist -user can drag the time borders of an event to change it (confirmation dialog needed if the event is a repeating event) -user can select the event and delete it (confirmation dialog needed if the event is a repeating event) F) Edit Events dialog: ---------------------------------------------------------------------------------------------------- | Edit Events |--------------------------------------------------------------------------------------------------- | Name: Untitled1 | Event Active: [x] ----------------------------|----------------------------------------------------------------------- | Type: | Days: | Time: | ( ) Ad/Jingle (Mask) | [x] Monday | ( ) Set start time only (play entire playlist) | ( ) Ad/Jingle | [x] Tuesday | ( ) Set time range | ( ) Alarm | [x] Wednesday | ( ) Set end time (plays now until end time) | ( ) Sleep | [x] Thursday | | (o) Normal Music | [x] Friday | From: ______ To: ______ | ( ) AutoPlay Music | [x] Saturday | Time1 | | [x] Sunday | Time2 | | | Time3 | | [x] Limit Date Range:| | | From: ____ To: _____ | Priority: ----------------------------------------------------------------------------------------------------- | Track/Playlist # Tracks | Actions: | Station ID (track) 1 | [ ] Set volume: ___ % | Jingle (playlist) 1 | [ ] Play as mask: | Hard Rock (playlist) All | [ ] Fade in at start (minutes): ___ | | [ ] Fade out at end (minutes): ___ | Queue Depth: __ | [ ] Insert Break at end | [ ] Repeat if time span not filled | [ ] Turn off at end |---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- Event Type Template descriptions: -Event Type: Indicates the type of event being scheduled and determines how it is handled. There are several types: --Alarm. Preconfigured with All days enabled, Priority=normal, date limiter not set, queue depth=0, fade-in set to 3 minutes + inserts at end of playlist --Sleep. Preconfigured with All days greyed out, Priority=normal, Start time: greyed out, End time=60 minutes from current time, date limiter greyed out, playlist=Now Playing, queue depth=0, fade out set to 10 minutes + inserts at end of playlist. --Normal Music. Preconfigured with Priority=normal, queue depth=3 --Ad/Jingle (Mask). Preconfigured with priority=high, End Time greyed out, queue depth=0 (this is used for playing an ad/jingle playlist at a specified time while music continues to play) --Ad/Jingle. Preconfigured with priority=normal, End Time greyed out, queue depth=0 (this is used for playing an ad/jingle playlist immediately following whatever song is playing at the specified time) --AutoPlay Music. Preconfigured with All days enabled, all times enabled, Priority=low, depth=1 (this is used as a rule to play music from some playlist whenever no other rules have been set and music has stopped playing. : this allows the user to add/change the track/playlist that should be played, or create a new playlist if no suitable ones exist. Creating a dialog for this purpose might be too much work. A suggested hack would be that when the user clicks this button, focus is shifted back to MM, where the user is able to right-click on a track/node/playlist and click/right-click any of the schedule event buttons to cause it to be added to the 'Edit Event' dialog. This isn't the greatest, but the alternative would involve setting up a Library tree and giving the user the ability to choose any track/node/playlist & give them the ability to create new playlists. We need to decide on the best tradeoff. g) description of variables and their effects: -[] Event Active Checkbox indicates whether the event is globally active or not. -Name: Shows a name for the scheduled event that is meaningful to the user -The Play Time days indicator: indicates what day(s) the event will occur on -The Play Time indicators: indicates, in 24hr notation, the duration for an event, or the end-time only, or the start-time(s) only, depending on the type of event (the implication being that depending on the type of event, sometimes a single duration needs to be set, sometimes a single end-time, and sometimes single or multiple start/end times). Times can be chosen to the minute. If an event is scheduled to occur multiple times, each event is treated completely independently--playlists don't 'continue' from one event to the next. -Priority: indicates the priority level of an event. High priority events finish before lower priority events scheduled for the same time slot can play. Possible values: high, normal, low. 'High' is generally used for events that interrupt others. 'Normal' is used for regular events. 'Low' is used for backup events that occur in case the user forgot to schedule a 'normal' event for a specified time. IMPORTANT: If multiple equivalent priority events are scheduled for the same time, the events are played in round-robin fashion--provided they are of equivalent priority. Otherwise, the higher priority event runs first. -Date Limiter: this optional field sets a limit to the date timeframe during which the scheduled events occur. Otherwise the events have no date driven limitation. -Track/Playlist: determines what Track/Node/Playlist is to be played for the event in question (note: as described earlier, the playlist or track is not necessarily played in its entirety). -Queue depth : Determines the minimum number of tracks that should be kept in the Now Playing queue. Valid values 0-x. If it's zero, then the queue is filled with the contents of that job (to the exclusion of other equal priority events scheduled in that time slot) up to a the maximum that can fit in the slot. If it is 1, the scheduler always ensures that there's 1 track in the Now Playing list after the currently playing track. If it is 2, the scheduler always ensures that there are 2 tracks in the Now Playing list after the currently playing track. -Fade in: Determines the amount of time to be used for volume to fade from 20% to the current setting of the mixer -Fade out: Determines the amount of time to be used for volume to fade from current mixer setting to 0% -Volume: Values: Default, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100% . This is used in case the user wishes to set a custom volume for the event in question. Always defaults to 'Default' (which is the current volume). -Insert at end: causes the event to pause the Now Playing list after the event is complete. -Turn off at end: causes the computer to turn off after the event is complete. h) Tooltips: -Ad/Jingle (Mask) -- Tooltip: This template is used for playing an ad/jingle playlist at a specified time while music continues to play -Ad/Jingle -- Tooltip: This template is used for playing an ad/jingle playlist immediately following whatever song is playing at the specified time -Alarm -- Tooltip: This template is used to set a timed alarm -Sleep -- Tooltip: This template is used to cause MediaMonkey to stop playing music after a set time -Normal Music -- Tooltip: This template is used to schedule music to play over a range of time -AutoPlay Music -- Tooltip: This template causes MediaMonkey to play music when no other events have been scheduled and the Now Playing list has run out. i) Default AutoPlay entry: By default an Entry called 'Default AutoPlay' should be created. Uses the AutoPlay music template, and one of the default Auto-Playlists (preferable a rotation playlist). j) Schedule indicator: if there are events scheduled & active at any point in the future, the MediaMonkey UI must indicate this in some manner, even when the scheduler UI is not shown. Currently MediaMonkey does this by flashing the 'Sleep' button between 2 states--this is one possible approach to use. Another would be an indicator somewhere in the status bar. k) Standard functionality User can't edit anything (but can view it). If the user tries to add/edit entries, the following appears: 'MediaMonkey Auto-DJ provides advanced scheduling functionality so that you can create advanced playlist rotations for parties, bars, background music in shopping centers, or radio broadcasts. If you wish to add/edit 3 Auto-DJ entries upgrade to MediaMonkey Gold. If you need unlimited scheduling capabilities for commercial applications, you need to purchase the Professional version.' l) Gold functionality User can have and edit up to 3 entries in the list (the silence suppression 'AutoPlay' entry counts as 1 of these). If a non-Pro user attempts to add a third entry, the following message should appear 'MediaMonkey Auto-DJ provides more advanced scheduling functionality so that you can create advanced playlist rotations for parties, bars, background music in shopping centers, or radio broadcasts. If you wish to add more than 3 Auto-DJ entries and use MediaMonkey for commercial use, you need to purchase the Professional version.' m) Pro functionality User can do whatever they want. n) Sample Usecases: i) User wants to schedule '2 for Tuesdays - 2 consecutive tracks by the same artist on Tuesdays, iterspersed with commercials', and ensuring that Station ID is played on the hour. -User creates 'Same Artist' autoplaylist consisting of 2 tracks by a single randomly selected artist, where Artist wasn't heard within 3 hours (this assumes that bugs #1457 and #1453 are resolved) -User creates rotation playlist called 2 for Tuesdays consisting of: 1 Station ID, 1 Ad, 10 Same Artist, 1 Jingle, 1 Ad, 20 Same Artist -User drags '2 for Tuesdays' to an empty slot on the Tuesday schedule, double clicks it, and changes it to occur _every_ tuesday in a 3 hour time slot. ii) User want to repeat a Jingle several times over the course of an event - Schedules the Jingle (a single track) to occur at several times ('normal' priority), by dragging it to a space on the schedule, double clicking it, and setting all the times at which it should occur. -->Since the other event is also schedule at 'normal' priority, the Jingle plays in a 'round-robin fashion'--i.e. after 1 song in the other event, the Jingle plays, then control is returned to the original event. iii) User wants to rapidly create a playlist and schedule it for overnight play. - User creates PlaylistA exactly as they do today and saves it. - If the user wants to intersperse te playlist with other music, and/or cause it to repeat, they create a rotation playlist consisting of PlaylistA and PlaylistB. - User drags the rotation playlist into the scheduler and drags the edges to fill the entire night's schedule. o) Open issues: The major issue that I see is the fact that it's difficult to add tracks/playlists to a scheduled event from within the Edit Event dialog. This is the same problem that occurs with CD Burning: the easiest way to add tracks/playlists to a CD is to drag them to the Now Playing window, however, this has the downside of mucking with the list of tracks that are in the queue to be played. What is needed is some means of adding tracks/nodes/playlists by selecting them (i.e. some sort of chooser). p) Options: When the user accesses the options menu via the Auto-DJ dialog, it should provide i) the ability to configure the sound device for the mask ii) Global proximity sensing settings for the scheduler: This would be identical to the functionality described in bug #1453. The reason for duplicating the functionality in the scheduler is to eliminate a dependency and to enable the setting to be global so it doesn't need to be set for each playlist individually except for specific cases. q) Deprecated Features: The scheduled events list has been deprecated in favour of using the simpler outlook-like calendar to show scheduled events, with the user being able to edit details by double-clicking an event. |--------------------------------------------------------------------------------------------------------------| | Scheduled Events | |--Event--|--------Event Schedule---------------|--Date Limiter--|---------------------|Now Playing| | |--Name---|S M T W T F S . . Time(s) . |Priority| . Start - End .|--Tracks/Playlist-----|Queue Depth|--Actions-| |[]-|[][][][][][][]. . . .|---| - |-----| . . . .| | | ... | ---------------------------------------------------------------------------------------------------------------- The events list functions similarly to the criteria lists in the advanced autoplaylist panel: -To create a new entry, the user simply clicks and the dialog described in j) appears. -To edit an existing entry, the user clicks it to select it and then clicks again causing j) to appear. -To enable an event, just click the checkbox next to it