-
Notifications
You must be signed in to change notification settings - Fork 6
Built In Player
TangoDisplay includes a native audio player that lets you manage and play your milonga setlist directly — no Music.app, Swinsian, or Embrace required. All display automation (cortina detection, tanda counting, coming-up preview, album artwork) works fully with the built-in player.
Screenshot placeholder: feature banner — full setlist view with tracks loaded
- Click the display icon in the menu bar › Show Settings Window
- Go to Player in the sidebar
- Under Player Source, select Built-in Player
- Switch to the Setlist tab to build your setlist
Once the built-in player is active, you can jump straight to the Setlist tab at any time from the menu bar: click the display icon › Show Setlist.
Screenshot placeholder: Player Settings view with Built-in Player selected
The Setlist tab is the main workspace for the built-in player. It shows your full track queue, player controls at the top, and setlist statistics at the bottom.
Drag tracks directly from:
- Music.app — drag from the track list or search results
- Swinsian — drag from the browser
- Finder — drag audio files from anywhere on your filesystem
Drop onto the track list or into the empty drop zone when the list is empty. Tracks are added with full metadata read from the audio file itself — they do not need to be in any library.
To insert mid-list, drag onto a specific row to place the new track before it rather than appending to the bottom.
Supported formats: MP3, M4A (AAC), AIFF, WAV, FLAC, CAF, Opus.
When Duplicate track protection is enabled in Player Settings, dropping a track that is already in the setlist (played or unplayed) shows an alert:
This track already exists in this set. Add anyway?
- Add — adds the duplicate.
- Don't Add — skips it.
- Remember for this session — check this before clicking either button to lock in your choice. Subsequent duplicates are then added or skipped silently for the rest of the session. The remembered choice is cleared when you click Clear Setlist.
Non-duplicate tracks in the same drag operation are always added immediately, regardless of this setting.
Screenshot placeholder: setlist view with several tracks showing mixed state (queued, playing, played)
Each row shows:
| Element | Details |
|---|---|
| State icon | Waveform = playing · Pause = paused/armed · Checkmark = played · Play = next up |
| Title & Artist | Extracted from the audio file's tags |
| Genre tag | Colour-coded: green = playing, orange = paused, blue = next to play, grey = queued/played |
| Year | Optional — toggle in Player Settings |
| Duration | Optional — toggle in Player Settings |
| Comments / Album Artist | Optional — toggle in Player Settings |
| Stop marker | Small stop icon when "Stop After This Track" is set |
| Auto-gap icon | Filled green wave = auto-gap silence applied before this track · Outlined grey wave = skipped or ignored |
The setlist persists across app restarts — it is saved automatically to Application Support.
The player controls sit above the track list.
Screenshot placeholder: player controls area showing level meter, transport, seek bar, fade buttons, volume, eye button, and artwork
The controls are arranged in three columns with a seek bar and volume row below:
- Level meter — dual-channel (L/R) bar graph on the left side of the controls panel. Gradient bars show real-time RMS level from green (quiet) through yellow to red (loud). White peak-hold markers latch for 2 seconds then decay; they turn red when clipping is detected. Tap the meter to reset clip indicators. A dB scale (-0, -3, -6, -12, -24) runs alongside.
- Eye button — scrolls the track list to highlight the currently playing track
- Track info — title and artist of the current track
- Transport button — large central play/stop button (see states below)
- Fade buttons — Fade & Stop and Fade & Continue (see below)
- Seek bar — drag to jump to any position in the track. When "After…" mark-as-played timing is active, a small vertical marker line shows the threshold position. An orange marker shows where auto-fade will begin (when Auto-fade is enabled for a cortina).
- Time display — elapsed and remaining time
- Volume slider — master volume for the built-in player (0–100%)
- Artwork panel — current track artwork, sized to match the height of the controls column. Falls back to the SetlistLogo placeholder when no artwork is embedded in the file.
| Colour | State | Click to… |
|---|---|---|
| Green (play icon) | Stopped / ready | Start playback |
| Accent (waveform) | Playing | Arm stop |
| Orange (pause icon) | Armed — stop pending | Confirm stop |
| Red (stop icon) | Stopped after confirm | Resume or start next |
Stopping playback requires two deliberate clicks to prevent mis-clicks mid-tanda:
- First click while playing → button turns orange, entering an "armed" state for approximately 3 seconds
- Second click within that window → playback stops
- No second click → the armed state expires and playback continues uninterrupted
This means a single accidental tap on the transport never kills the music.
The two fade buttons are enabled only when the currently playing track is a recognised cortina — they are never active on dance tracks. Use them when you want to end a cortina early rather than letting it play to its natural finish:
| Button | What it does |
|---|---|
| Fade & Stop | Smoothly fades the cortina volume to zero over the configured duration, then stops. |
| Fade & Continue | Smoothly fades the cortina volume to zero, then immediately advances to the next track and restores volume. |
Both buttons are disabled while a fade is already in progress. The fade uses an exponential curve for a natural, professional sound.
Configure the fade duration in Player Settings › Cortina fade (1–15 seconds).
When Auto-fade all cortinas is enabled, the fade buttons are automatically disabled while a cortina is playing — the auto-fade will handle the transition at the configured time. Right-click the cortina in the setlist and select Skip Auto-fade to re-enable manual control for that track.
Drag rows up or down to reorder. Tracks that have already been played are locked in place and cannot be moved — only queued (unplayed) and paused tracks are draggable. This prevents accidentally scrambling your played history.
Right-click any row:
| Action | What it does |
|---|---|
| Mark as Played | Stamps a queued track as played without playing it |
| Mark as Not Played | Resets a played track to queued so it will play again |
| Stop after Playing | Sets a stop marker — playback halts automatically when this track finishes. Shows as Resume after Playing when already set; click again to clear it. |
| Delete | Removes the track from the setlist (asks for confirmation) |
| Ignore Auto-gap before this Track | Disables auto-gap for this track only. Shows as Resume Auto-gap when already set; click again to re-enable it. |
| Skip Auto-fade | Disables auto-fade for this cortina track only, re-enabling the Fade & Stop and Fade & Continue buttons for manual control. Available only when Auto-fade is enabled and fading has not yet started. |
Screenshot placeholder: right-click context menu on a setlist row
Bulk mark: ⌘-click or Shift-click to select multiple rows, then right-click to apply Mark as Played or Mark as Not Played to all selected tracks at once.
When Stop after Playing is set on a row, a small stop icon appears in that row and playback halts automatically when that track completes. Right-click the same row again and select Resume after Playing to clear the marker. Only one stop marker can be active at a time.
Click the Clear Setlist button in the toolbar. This removes all tracks and resets all playback state.
A status bar at the bottom of the track list shows:
Screenshot placeholder: setlist footer showing total duration and estimated end time
- Total duration — the combined length of all remaining unplayed tracks
- Estimated end time — a projected clock time when the setlist will finish, calculated from the current elapsed position, all remaining queued tracks, and any stop-after marker (e.g. "Ends ~23:45")
- Auto-gap status — when auto-gap is enabled, a small green dot and "Auto-gap: on" label appear. The dot turns grey and the label reads "Auto-gap: off" when the feature is disabled.
- Auto-fade status — when auto-fade is enabled, a small orange dot and "Auto-fade: on" label appear alongside the auto-gap indicator. The dot turns grey and the label reads "Auto-fade: off" when the feature is disabled.
Auto-gap analyses the silence at track boundaries and schedules a silent preroll buffer before each track so the gap between songs always meets your target minimum — useful for tango DJs who want consistent, perceptible separations between tandas without adding unnecessary dead air.
How it works: TangoDisplay reads the audio waveform at the end of the finishing track and the start of the incoming track, measures the existing silence, then prepends exactly as much extra silence as needed. Only silence is ever added — it never shortens a gap. If the existing silence already meets the minimum, a 1-second buffer is still inserted so the separation is always audible.
- Go to Settings › Player
- Under Built-in Player, enable the Auto-gap toggle
- Use the Minimum gap slider to set your target (0.5–5 s; default 4 s)
When Skip gap before first track is enabled (the default), the opening track of the setlist starts immediately with no silence preroll — the gap only applies between consecutive tracks. Disable this if you want the same treatment from the very first song.
Right-click any queued track row and select Ignore Auto-gap before this Track to exempt that individual track. The option becomes Resume Auto-gap when already set; click it again to re-enable. This lets you keep auto-gap active globally while skipping it for specific tracks (e.g. a track you want to follow immediately after its predecessor).
Three places in the UI reflect auto-gap state:
| Indicator | What it means |
|---|---|
| Setlist footer dot | Green dot + "Auto-gap: on" = feature active. Grey dot + "Auto-gap: off" = feature disabled. |
| Filled green wave icon on a track row | Auto-gap silence was successfully scheduled before this track |
| Outlined grey wave icon on a track row | Auto-gap was skipped or ignored for this track (first track with "Skip gap before first track" on, or per-track override active) |
| (no icon) | Auto-gap not applicable to this track |
Auto-fade automatically fades out a cortina and advances to the next track after a configurable play time — useful when you want cortinas to end cleanly without manual intervention.
- Go to Settings › Player
- Under Built-in Player, enable the Auto-fade all cortinas toggle
- Use the Cortina play time slider to set how many seconds of the cortina should play before the fade begins (5–120 s; default 30 s)
When a cortina starts, an orange marker appears on the seek bar to show exactly when the fade will trigger.
Short cortinas: If a cortina is shorter than the play time plus the fade duration, TangoDisplay adjusts automatically — the fade starts early enough to complete before the track ends.
When auto-fade is enabled for a cortina, the Fade & Stop and Fade & Continue buttons in the player controls are disabled — the auto-fade will handle the transition at the right moment. Once the fade begins, it cannot be interrupted.
Right-click any cortina row in the setlist and select Skip Auto-fade to disable auto-fade for that track only. The orange seek-bar marker disappears and the fade buttons become active for manual control. The option is hidden once the fade has already started.
| Indicator | What it means |
|---|---|
| Orange marker on seek bar | The point at which auto-fade will begin for the current cortina |
| Setlist footer orange dot | Orange dot + "Auto-fade: on" = feature active. Grey dot + "Auto-fade: off" = feature disabled. |
| Fade buttons (disabled) | Auto-fade is scheduled — the transition will happen automatically |
Click the Balance button (dial icon) in the Setlist toolbar to open the balance popover.
- Drag the slider left to shift audio towards the left channel, or right to shift it towards the right.
- The readout above the slider shows Centre, L N%, or R N% depending on the current position.
- Click Centre to snap back to balanced (0).
The balance setting persists across app restarts. The Balance button is disabled when the built-in player is not active.
Click the Share button (↑ icon) in the Setlist toolbar to open the export menu. The button is disabled when the setlist is empty.
Creates a new Apple Music playlist containing all tracks in the current setlist. The playlist is named with the current date and time.
Note: Export to Apple Music requires the Automation › Music permission. macOS will prompt for this on first use.
Opens a Save dialog and writes a standard M3U8 playlist file. Each track is written as an #EXTINF: line (with duration and Artist — Title metadata) followed by the absolute file path. The default filename is Tango Display SetList DDMMYY HH:MM.m3u8.
Use this to import your milonga setlist into any M3U-compatible player or DJ software.
Click the Equaliser button in the toolbar to open the EQ popover.
Screenshot placeholder: EQ popover with five vertical sliders
| Band | Frequency | Type |
|---|---|---|
| Band 1 | 60 Hz | Low shelf |
| Band 2 | 250 Hz | Peaking |
| Band 3 | 1 kHz | Peaking |
| Band 4 | 4 kHz | Peaking |
| Band 5 | 12 kHz | High shelf |
Each band has a vertical slider with a ±12 dB range. The current gain is shown above each slider.
Click Flat to reset all bands to 0 dB in one click.
EQ settings are saved across sessions.
By default the built-in player uses the macOS system default output device. To route audio to a specific device (e.g. a dedicated DJ audio interface):
- Go to Player in the Settings sidebar
- Under Built-in Player, open the Main output picker
- Select your device
The list shows all currently available audio output devices. If the selected device is disconnected, playback falls back to the system default automatically.
When the built-in player is active, the dancer display responds exactly as it does with Music.app:
- Cortina detection — your Cortina Rules apply to every setlist track. A track whose genre matches a cortina rule triggers cortina mode on the display automatically.
- Tanda counting — TangoDisplay counts consecutive non-cortina tracks to determine tanda position (e.g. "Track 2 of 4").
- Coming-Up preview — during a cortina, the next tanda's first dance track is shown as the "Coming Up" track on the display.
- Album artwork — extracted from the audio file and shown on the dancer display (if artwork display is enabled in Appearance settings).
No additional configuration is needed — the display sync is fully automatic.
Go to Player in the Settings sidebar.
Screenshot placeholder: Player Settings view showing all sections
Choose which player TangoDisplay listens to:
| Source | How it works |
|---|---|
| Music.app | Polls via AppleScript every 2 seconds. Full tanda counting and playlist look-ahead. |
| Swinsian | Real-time push notifications. Tanda position shown; total track count unavailable. |
| Embrace | Real-time notifications + AppleScript polling. Full tanda counting. |
| Built-in Player | TangoDisplay plays audio directly. Build your setlist in the Setlist tab. |
These options appear only when Built-in Player is selected.
Main output — the audio device to use for playback. Defaults to the macOS system output.
Cortina fade — duration of the volume fade used by Fade & Stop and Fade & Continue (1–15 seconds, in 0.5-second steps). Default: 5 seconds.
Duplicate track protection — when enabled, dropping a track that already exists in the setlist shows a confirmation alert before adding it. Includes a Remember for this session checkbox that silences the prompt for the rest of the session (until the setlist is cleared). Off by default.
Auto-gap — when enabled, TangoDisplay analyses silence at track boundaries and pads each transition with a silent preroll so the gap always meets the minimum. Only silence is added — existing gaps are never shortened.
Minimum gap — the target gap duration in seconds (0.5–5 s, in 0.5-second steps). Default: 4 seconds. Visible only when Auto-gap is enabled.
Skip gap before first track — when on (default), the first track in the setlist starts immediately with no silence preroll. The gap applies only between consecutive tracks.
Auto-fade all cortinas — when enabled, TangoDisplay automatically fades out cortinas and advances to the next track at the configured play time. Requires cortina detection to be set up via Cortina Rules.
Cortina play time — how many seconds of a cortina should play before the auto-fade begins (5–120 s, in 1-second steps). Default: 30 seconds. Visible only when Auto-fade is enabled. For cortinas shorter than play time + fade duration, the fade starts earlier so it always completes cleanly.
Mark as played — controls when a track receives its played stamp:
| Option | Behaviour |
|---|---|
| After song ends | The track is marked only when it plays all the way to completion |
| After… | The track is marked after a set number of seconds of playback (1–30 seconds). A marker line on the seek bar shows the threshold. Once marked, pressing play again skips to the next queued track. |
Toggles for which fields appear in setlist rows (visible only with Built-in Player selected):
| Field | Default | Notes |
|---|---|---|
| Title | Always on | Cannot be hidden |
| Artist | Always on | Cannot be hidden |
| Genre | Always on | Cannot be hidden |
| Year | On | |
| Time | On | Shows duration and current position |
| Comments | Off | |
| Album Artist | Off |
The Advanced tab in Settings lets you apply optional regex-based rules to reformat how Artist, Title, Year, Album Artist, and Comments are displayed on the dancer screen — without modifying the original music tags. See Advanced Settings for full details and examples.