mrrepac931 downloadsAdvanced sidebar audio player for songwriting: waveform, work marker, A-B loop zone, play counters and hotkeys. Playback survives note scrolling and closing the panel.
An advanced sidebar audio player for songwriting.
Obsidian's embedded audio unloads as the note scrolls, and playback cuts off. Songwriter keeps the player in its own side panel: scroll your lyrics as much as you like — the music keeps playing. Playback even survives closing the panel (the sound lives in the plugin, not in the UI).
Читаете по-русски? Есть русская версия README.
![[song.mp3]] or a link [[song.mp3]]). If music is already playing, it offers
to switch with a small banner instead of interrupting. The mode is configurable:
hybrid / always / manual.⏮ ⏭ walk the list, and the list survives ejecting the track, so you can pick
the next one from it. Optionally the playlist plays through on its own.Alt while dragging and the file itself goes out
instead — to the system file explorer, the desktop, or an audio editor such as
REAPER, which only accepts a real file on disk, not the virtual one an ordinary
browser drag offers. Alt-dragging into Obsidian itself does nothing — that is
the deliberate cost of splitting the two gestures. The native handoff is
desktop-only; on mobile there is no such route.⏮ ⏭ walk, and it is remembered. Folder playlists only: a playlist built from
a note keeps the order the note itself gives it.A in a track, S saved, D dropped, F new again — for
the loaded track — ↑ ↓ walk the playlist, and ← → seek by the step
set in the settings. They are matched by
physical key, so any keyboard layout works, and a text field keeps its keys. Under the playlist header a search box narrows the list by
name (every word, any order), a filter shows all tracks, new ones or one mark,
and a counter says how far the sorting has got (34/97). A gauge button
there measures tempo and key of every track that has none yet — one at a
time, with progress in a notice; click it again to stop. Dropped tracks can
go for good: one from its row's menu, all of them from the filter menu — after
a confirmation that also says how many of them notes still link to. They go to
the trash set in Obsidian's Files and links settings. There is also a command
that steps the loaded track's mark, without a default key. Marks are separate
from the marker and are remembered per file.Copy track to current note command, or the same item in a playlist row's right-click menu. The copy
lands in the vault's own attachment folder and is embedded in the note as a
waveform; the track's marker, counters and measured tempo and key
come with it. Playback is not interrupted — filing is not listening. Sending
the same track again links the copy that is already there instead of making a
twin.▶ 27 · 2h40m).
A run only counts once 5 seconds have actually sounded (start-and-stop does not
count; pause-and-resume keeps accumulating).
Listened time accumulates only while sound is actually playing. Right-click the
counter to reset both.Alt+D) to jump to the
note the track was picked up from: if it is open in a tab, that tab is focused,
otherwise the note opens; if the source is unknown, any note linking to the file is
used.Unload track command):
the player clears and holds nothing while you work on other things; the hotkeys
cannot fire by accident. Load a track again with the "Load audio from the note"
button or just by opening a note with audio.Open track in default app, Reveal track in system explorer. The embedded-player buttons can be turned
off in settings.The marker is visible right on the waveform (an orange flag) — there are no separate indicators in the panel. Time, buttons and volume share a single line under the waveform.
All commands can be rebound in Settings → Hotkeys. The Russian keyboard layout is duplicated out of the box.
| Command | Keys |
|---|---|
| Play from marker (or from start) | Alt+X |
Stop (double press: the next Alt+X plays from the start, marker intact) |
Alt+C |
| Set marker at current position | Alt+Z |
| Play/Pause | Alt+P |
| Open track's note | Alt+D |
| Seek back / forward | Alt+, / Alt+. |
| Previous / next track in the playlist | Alt+B / Alt+N |
| Play slower / faster (one bpm a step, the key stays put) | Alt+- / Alt+= |
| Transpose down / up a semitone (desktop only) | Alt+PageDown / Alt+PageUp |
| Play as recorded again — speed and key | Alt+0 |
On the numeric keypad the four of them sit together, under one hand:
Alt+÷ / Alt+× transpose down and up, Alt+− / Alt++ step the tempo.
Without default keys: Clear marker, Load audio from current note, Open player panel, Unload track, Copy track to current note, Open track in default app, Reveal track in system explorer.
Besides the basics (pickup mode, seek step, start from marker) there is a playlist section (whole folder as a playlist, play the playlist through) and a fine-tuning one: the play-count threshold, the double-stop window, the waveform height, and the embedded-player button.
Markers, counters and sorting marks are stored in the plugin's data.json, keyed by the
audio file path; when a file is renamed inside the vault, its data moves along
automatically.
The interface follows Obsidian's language (English, or Russian when the app is set to Russian), works on desktop and mobile ("open externally" needs desktop).
npm install
npm run build # tsc typecheck + esbuild → main.js
npm run dev # watch mode
npm test # bundles the real source and drives it against stubs
The tests need no framework: they bundle src/ exactly as it ships, run it with a
stub obsidian module, and drive the result — so what is checked is the artifact
users install, not a restatement of the logic. The settings suite guards the round
trip through data.json, where a field added to the type but forgotten in the
migration is written faithfully and then dropped on the next start.
GNU AGPL-3.0. Tempo is measured by TempoCNN
(model deeptemp_k16, © Hendrik Schreiber), licensed under the AGPL-3.0, so the
combined work is too. Key is measured by S-KEY
(© Deezer, ICASSP 2025), under the MIT license. Both networks run in plain
JavaScript inside the plugin: the weights are converted from the original models
by tools/export-models.py into models/, and tests/detect.test.mjs holds the
port to the originals' own output.
Transposition is done by Signalsmith Stretch 1.3.2 (© Geraint Luff / Signalsmith Audio), bundled unmodified from npm under the MIT license, which is compatible with the AGPL.
Using the plugin carries no obligations. Distributing a modified version does: the source has to stay available under the same license.
Author: mrrepac · AGPL-3.0