feat: added a read-only piano roll automation view

This commit is contained in:
Xiaohan-Tian
2026-05-07 22:55:19 -07:00
parent f3d26126fa
commit 917a1b0a21
12 changed files with 787 additions and 34 deletions
+148 -2
View File
@@ -201,6 +201,34 @@
left: 0;
}
.piano-roll-automation-toolbar-group {
display: flex;
align-items: center;
margin-right: 5px;
}
.piano-roll-toolbar .automation-toggle-button {
width: 20px;
min-width: 20px;
margin: 0px 0px 0px 3px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border: 1px solid #444;
border-right: 0px;
font-size: 11px;
font-weight: 700;
}
.piano-roll-toolbar .automation-type-dropdown {
min-width: 92px;
height: 20px;
margin: 0;
padding: 0 6px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
font-size: 10px;
}
/* Spectrogram toolbar controls */
.spectrogram-toolbar-controls {
display: flex;
@@ -267,7 +295,35 @@
display: flex;
flex-direction: column;
height: 100%;
overflow: auto;
overflow-x: auto;
overflow-y: hidden;
}
.piano-roll-main-section {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
min-width: calc(var(--max-number-of-bars) * var(--region-grid-bar-width) + var(--region-piano-key-width));
}
.piano-roll-main-section.with-automation {
flex: 0 0 50%;
}
.piano-roll-note-scroll {
flex: 1;
min-height: 0;
overflow-y: auto;
overflow-x: visible;
}
.piano-roll-automation-section {
flex: 0 0 50%;
min-height: 0;
min-width: calc(var(--max-number-of-bars) * var(--region-grid-bar-width) + var(--region-piano-key-width));
border-top: 1px solid #3a3a3a;
overflow: hidden;
}
.spectrogram-loading-overlay {
@@ -423,6 +479,96 @@
z-index: 3;
}
.piano-roll-automation-lane {
position: relative;
height: 100%;
background: linear-gradient(180deg, #343434 0%, #2e2e2e 100%);
overflow: hidden;
}
.piano-roll-automation-track {
position: relative;
height: 100%;
min-height: 160px;
min-width: calc(var(--max-number-of-bars) * var(--region-grid-bar-width) + var(--region-piano-key-width));
}
.piano-roll-automation-track::before {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: var(--region-piano-key-width);
width: 1px;
background-color: rgba(255, 255, 255, 0.08);
}
.piano-roll-automation-gutter {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: var(--region-piano-key-width);
background: linear-gradient(180deg, #343434 0%, #2e2e2e 100%);
}
.piano-roll-automation-grid {
position: absolute;
top: 0;
bottom: 0;
left: var(--region-piano-key-width);
right: 0;
background: linear-gradient(180deg, #343434 0%, #2e2e2e 100%);
background-image:
repeating-linear-gradient(to right,
transparent,
transparent calc(var(--region-grid-beat-width) - 1px),
rgba(255, 255, 255, 0.08) calc(var(--region-grid-beat-width) - 1px),
rgba(255, 255, 255, 0.08) var(--region-grid-beat-width));
}
.piano-roll-automation-lane-label {
position: absolute;
top: 8px;
left: 10px;
z-index: 1;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.04em;
color: #87cefa;
text-transform: uppercase;
}
.piano-roll-automation-svg {
position: absolute;
inset: 0;
overflow: visible;
}
.piano-roll-automation-line {
filter: drop-shadow(0 0 2px rgba(135, 206, 250, 0.3));
}
.piano-roll-automation-value {
font-size: 11px;
font-weight: 700;
paint-order: stroke;
stroke: rgba(30, 30, 30, 0.8);
stroke-width: 2px;
pointer-events: none;
}
.piano-roll-automation-empty-state {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
color: #7893a5;
font-size: 11px;
pointer-events: none;
}
.resize-handle {
position: absolute;
right: 5px;
@@ -463,4 +609,4 @@
color: #e0e0e0;
min-width: 20px;
text-align: center;
}
}