Music Practice Journal - With Existing Plugins?

A couple of ideas. Here’s a dataview LIST query that displays the date of the most recent daily note to link to a Song Part (Obsidian 1.12.7, Dataview 0.5.68):

LIST date
FROM [[Song]]
WHERE length(filter(file.outlinks, (x) => meta(x).subpath = "Part")) > 0
SORT date DESC
LIMIT 1

It has to be a list, and it can only render properties of the entire daily note. The advantage is that it only needs the daily note to link to the song part to appear in the list.

To render the full “Last Played at 120bpm on 1/1/26. Status: Solid” in the Song-Part text, I would expect you’d need rich structured metadata, as YAML source on the daily note. To render the result cleanly, it’d need to be a dataviewjs, but you could capture it in a plugin that just provides the rendering function.

Here’s a working example of that. In the daily note YAML source metadata:

---
date: 2026-05-31
practiced:
  - song: "Song"
    part: "Part One"
    bpm: 120
    status: solid
  - song: "Song"
    part: "Part Two"
    bpm: 80
    status: weak
---

Function (which could be provided by a plugin) and its use (on the Song page):

function mostRecentPracticed(song, part) {
	let practiceFilter = p => (p.song == song && p.part == part);
	let mostRecentPage = dv.pages()
		.where(d => d.practiced && d.practiced.some(practiceFilter))
		.sort(d => d.date, "desc")
		.first();
	let practiceRecord = mostRecentPage?.practiced.filter(practiceFilter).first();
	if (!practiceRecord) {
		return "Not yet practiced";
	}
	return "Last played at " + practiceRecord.bpm + " bpm on " + new Date(mostRecentPage.date).toLocaleDateString() + ". Status: " + practiceRecord.status;
}

dv.paragraph(mostRecentPracticed("Song", "Part One"));

I’m still learning Dataview so I welcome refinements and other suggestions.