Replies: 1 comment 1 reply
-
|
Hey @mrhanna! Thanks for this, the music implementation has been the most fluid thing in OpenMarch and a lot of time has been spent experimenting with different systems.
Answering your questionsPreambleWhen designing the music system, I had the following non-negotiables
Beat StorageFirstly
This is correct. All of the timing/tempo data lives in the Base tempo off drill pages
I understand what you're saying here as the end product has the tempo data attached. The reason I intentionally made the tempo data separate from the pages was so changes in page length during the designing process didn't upend
They do have set lengths, but not for long. The new curved path system is going to introduce customizable midsets. I say this, but the midsets are actually using the progress from the current page to the next, not an individual beat export const midsets = sqliteTable(
"midsets",
{
id: integer().primaryKey(),
/** The ID of the marcher page this midset is going to */
mp_id: integer()
.notNull()
.references(() => marcher_pages.id, { onDelete: "cascade" }),
x: real().notNull(),
y: real().notNull(),
/** The progress placement of the midset on the marcher page */
progress_placement: real().notNull(),
created_at: text().default("sql`(CURRENT_TIMESTAMP)`").notNull(),
updated_at: text()
.default("sql`(CURRENT_TIMESTAMP)`")
.notNull()
.$onUpdate(() => sql`(CURRENT_TIMESTAMP)`),
path_data_id: integer().references(() => pathways.id, {
onDelete: "set null",
}),
path_start_position: real(),
path_end_position: real(),
notes: text(),
},
);
This I 100% agree with, it's currently super annoying. I do think there's ways around this with our current system. You mentioned #512, which proposes a solution to exactly this Event markers
As you deduced, tempo groups are just an abstraction around beats so that users have a sensible way to edit them. In a way (and tell me if I'm missing this mark) tempo groups are distinct event markers. What OpenMarch is doing is just reading the durations of all the beats, calculating what the "tempo" is ( The goal of tempo groups was to create some way to mark changes in the tempo, and then the beats in the database would just be updated to reflect that
This highlights a big reason I picked individual beats. I almost went with easing functions, but the more I thought about it, the more I realized I have no idea how people want tempo changes to be done. Creating the individual beats was essentially me throwing my hands in the air and being like "they should just be able to define the tempos themselves if they really want to" One hole I think creative software can fall into is the developers assuming they know what the designer wants for all things. There are cases where this is true, i.e. a line is always a line and the designer doesn't want to make every little decision involved with that. But, we have no idea what audio files designers are writing their music to. If we define our own easing functions, there will always be some edge case we never thought about.
I believe it already does this, but am I missing something? The page starts at a certain beat and then goes until the next page starts
Rehearsal markers already kind of do nothing, but they do differentiate groups (so I guess that's something?)
This is what we were trying to avoid. When we make everything a beat, we don't actually care about what the time signature is. We just care about how much time a beat should take up in the music and how often it should occur. This goes back to the "drill-writer not DAW" idea. EpilogueI think you are right on the money with event markers. This makes a lot more sense from a user perspective. I say this was the goal of tempo groups, but it has already lead to a lot of confusion and there is a ton of current limitations SO, going from here, this is what I think:
Sorry for getting back to you so late, but thanks so much for this! Lmk your thoughts |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Hello! I'm Michael, I'm a freelance musician and aspiring developer. I've been wanting to get my feet wet in open source for a long time, and I'm excited to have found a music-related project that aligns with tech I'm familiar with!
I'm still trying to onboard myself with the project and am curious about the state of beats and tempo groups. There are several open issues related to this (#591, #512, #393, #392). There's a lot of code already written in this area, but wondering if I have the gist right: it looks like every beat in a show lives in the database in the Beat table, and in essence, the TempoGroup tools provide a high level way to manipulate those low level beats in bulk.
Do I have this right? What is the advantage of persisting each beat?
Possible alternative?
If so, I wonder from both a UX and DX perspective why the model of the timing system couldn't be simplified to a series of discrete events (e.g. tempo changes, meter changes, rehearsal marks, repeats, etc), without involving "groups" at all. Not unlike keyframes.
Rather than basing the number of measures/beats in the project off of data defined in tempo groups, base it off of drill pages in the timeline.
Rather than defining tempo and meter changes with tempo groups, define them with discrete event markers.
I suppose with less information persisted, more math would have to be done on the fly for animation, but the math for timing keyframes should be relatively simple, right?
Beta Was this translation helpful? Give feedback.
All reactions