Skip to content

Commit c5dcfe6

Browse files
rkfgddennedy
authored andcommitted
Support keyframes in highpass audio filter
1 parent b2dffa8 commit c5dcfe6

File tree

2 files changed

+108
-23
lines changed

2 files changed

+108
-23
lines changed

src/qml/filters/audio_highpass/meta.qml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,33 @@ Metadata {
77
name: qsTr("High Pass")
88
mlt_service: 'ladspa.1890'
99
qml: 'ui.qml'
10+
keyframes {
11+
allowAnimateIn: true
12+
allowAnimateOut: true
13+
simpleProperties: ['0', '1', 'wetness']
14+
parameters: [
15+
Parameter {
16+
name: qsTr('Cutoff')
17+
property: '0'
18+
isCurve: true
19+
minimum: 5
20+
maximum: 21600
21+
units: 'Hz'
22+
},
23+
Parameter {
24+
name: qsTr('Rolloff rate')
25+
property: '1'
26+
isCurve: true
27+
minimum: 1
28+
maximum: 10
29+
},
30+
Parameter {
31+
name: qsTr('Wetness')
32+
property: 'wetness'
33+
isCurve: true
34+
minimum: 0
35+
maximum: 1
36+
}
37+
]
38+
}
1039
}

src/qml/filters/audio_highpass/ui.qml

Lines changed: 79 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,40 +21,70 @@ import QtQuick.Controls 2.12
2121
import QtQuick.Layouts 1.12
2222
import Shotcut.Controls 1.0 as Shotcut
2323

24-
Item {
24+
Shotcut.KeyframableFilter {
25+
property string cutoffProperty: '0'
26+
property string stagesProperty: '1'
27+
property string wetnessProperty: 'wetness'
2528
width: 350
2629
height: 125
30+
keyframableParameters: preset.parameters
31+
startValues: [39, 1, 0]
32+
middleValues: [39, 1, 1]
33+
endValues: [39, 1, 0]
2734
Component.onCompleted: {
2835
if (filter.isNew) {
2936
// Set default parameter values
30-
filter.set('0', 39)
31-
filter.set('1', 1)
32-
filter.set('wetness', 1.0)
37+
filter.set(cutoffProperty, 39)
38+
filter.set(stagesProperty, 1)
39+
filter.set(wetnessProperty, 1.0)
3340
filter.savePreset(preset.parameters)
3441
}
3542
setControls()
3643
}
3744

3845
function setControls() {
39-
sliderCutoff.value = filter.getDouble('0')
40-
sliderStages.value = filter.get('1')
41-
sliderWetness.value = filter.getDouble('wetness') * sliderWetness.maximumValue
46+
var position = getPosition()
47+
blockUpdate = true
48+
sliderCutoff.value = filter.getDouble(cutoffProperty, position)
49+
cutoffKeyframesButton.checked = filter.animateIn <= 0 && filter.animateOut <= 0 && filter.keyframeCount(cutoffProperty) > 0
50+
sliderStages.value = filter.getDouble(stagesProperty, position)
51+
stagesKeyframesButton.checked = filter.animateIn <= 0 && filter.animateOut <= 0 && filter.keyframeCount(stagesProperty) > 0
52+
sliderWetness.value = filter.getDouble(wetnessProperty, position) * sliderWetness.maximumValue
53+
wetnessKeyframesButton.checked = filter.animateIn <= 0 && filter.animateOut <= 0 && filter.keyframeCount(wetnessProperty) > 0
54+
blockUpdate = false
55+
enableControls(isSimpleKeyframesActive())
56+
}
57+
58+
function enableControls(enabled) {
59+
sliderCutoff.enabled = sliderStages.enabled = sliderWetness.enabled = enabled
60+
}
61+
62+
function updateSimpleKeyframes() {
63+
updateFilter(cutoffProperty, sliderCutoff.value, cutoffKeyframesButton, null)
64+
updateFilter(stagesProperty, sliderStages.value, stagesKeyframesButton, null)
65+
updateFilter(wetnessProperty, sliderWetness.value / sliderWetness.maximumValue, wetnessKeyframesButton, null)
4266
}
4367

4468
GridLayout {
4569
anchors.fill: parent
4670
anchors.margins: 8
47-
columns: 3
71+
columns: 4
4872

4973
Label {
5074
text: qsTr('Preset')
5175
Layout.alignment: Qt.AlignRight
5276
}
5377
Shotcut.Preset {
5478
id: preset
55-
parameters: ['0', '1', '2', 'wetness']
56-
Layout.columnSpan: 2
57-
onPresetSelected: setControls()
79+
parameters: [cutoffProperty, stagesProperty, wetnessProperty]
80+
Layout.columnSpan: parent.columns - 1
81+
onBeforePresetLoaded: {
82+
resetSimpleKeyframes()
83+
}
84+
onPresetSelected: {
85+
setControls()
86+
initializeSimpleKeyframes()
87+
}
5888
}
5989

6090
Label { text: qsTr('Cutoff frequency')
@@ -65,14 +95,18 @@ Item {
6595
minimumValue: 5
6696
maximumValue: 21600
6797
suffix: ' Hz'
68-
value: filter.getDouble('0')
69-
onValueChanged: {
70-
filter.set('0', value)
71-
}
98+
onValueChanged: updateFilter(cutoffProperty, value, cutoffKeyframesButton, getPosition())
7299
}
73100
Shotcut.UndoButton {
74101
onClicked: sliderCutoff.value = 39
75102
}
103+
Shotcut.KeyframesButton {
104+
id: cutoffKeyframesButton
105+
onToggled: {
106+
enableControls(true)
107+
toggleKeyframes(checked, cutoffProperty, sliderCutoff.value)
108+
}
109+
}
76110

77111
Label { text: qsTr('Rolloff rate')
78112
Layout.alignment: Qt.AlignRight
@@ -81,14 +115,18 @@ Item {
81115
id: sliderStages
82116
minimumValue: 1
83117
maximumValue: 10
84-
value: filter.get('1')
85-
onValueChanged: {
86-
filter.set('1', value)
87-
}
118+
onValueChanged: updateFilter(stagesProperty, value, stagesKeyframesButton, getPosition())
88119
}
89120
Shotcut.UndoButton {
90121
onClicked: sliderStages.value = 1
91122
}
123+
Shotcut.KeyframesButton {
124+
id: stagesKeyframesButton
125+
onToggled: {
126+
enableControls(true)
127+
toggleKeyframes(checked, stagesProperty, sliderStages.value)
128+
}
129+
}
92130

93131
Label { text: qsTr('Dry')
94132
Layout.alignment: Qt.AlignRight
@@ -100,17 +138,35 @@ Item {
100138
decimals: 1
101139
label: qsTr('Wet')
102140
suffix: ' %'
103-
value: filter.getDouble('wetness') * maximumValue
104-
onValueChanged: {
105-
filter.set('wetness', value / maximumValue)
106-
}
141+
onValueChanged: updateFilter(wetnessProperty, value / maximumValue, wetnessKeyframesButton, getPosition())
107142
}
108143
Shotcut.UndoButton {
109144
onClicked: sliderWetness.value = sliderWetness.maximumValue
110145
}
146+
Shotcut.KeyframesButton {
147+
id: wetnessKeyframesButton
148+
onToggled: {
149+
enableControls(true)
150+
toggleKeyframes(checked, wetnessProperty, sliderWetness.value / sliderWetness.maximumValue)
151+
}
152+
}
111153

112154
Item {
113155
Layout.fillHeight: true
114156
}
115157
}
158+
Connections {
159+
target: filter
160+
onChanged: setControls()
161+
onInChanged: updateSimpleKeyframes()
162+
onOutChanged: updateSimpleKeyframes()
163+
onAnimateInChanged: updateSimpleKeyframes()
164+
onAnimateOutChanged: updateSimpleKeyframes()
165+
onPropertyChanged: setControls()
166+
}
167+
168+
Connections {
169+
target: producer
170+
onPositionChanged: setControls()
171+
}
116172
}

0 commit comments

Comments
 (0)