Skip to content

Commit ce71ecb

Browse files
authored
Merge pull request #403 from linxmix/spike/3-band-eq
Spike/3 band eq
2 parents 9f63296 + 7b8fe88 commit ce71ecb

File tree

4 files changed

+157
-15
lines changed

4 files changed

+157
-15
lines changed

app/components/mix-builder/precision-controls/transition.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import {
1111

1212
import {
1313
CONTROL_TYPE_VOLUME,
14+
CONTROL_TYPE_LOW_BAND,
15+
CONTROL_TYPE_MID_BAND,
16+
CONTROL_TYPE_HIGH_BAND,
1417
CONTROL_TYPE_FILTER_HIGHPASS_CUTOFF,
1518
CONTROL_TYPE_FILTER_LOWPASS_CUTOFF,
1619
CONTROL_TYPE_DELAY_WET,
@@ -19,6 +22,9 @@ import {
1922

2023
const AUTOMATION_OPTIONS = {
2124
[CONTROL_TYPE_VOLUME]: 'Volume',
25+
[CONTROL_TYPE_LOW_BAND]: 'Low EQ',
26+
[CONTROL_TYPE_MID_BAND]: 'Mid EQ',
27+
[CONTROL_TYPE_HIGH_BAND]: 'High EQ',
2228
[CONTROL_TYPE_FILTER_HIGHPASS_CUTOFF]: 'Highpass',
2329
[CONTROL_TYPE_FILTER_LOWPASS_CUTOFF]: 'Lowpass',
2430
[CONTROL_TYPE_DELAY_WET]: 'Delay Wet',

app/mixins/playable-arrangement/automatable-clip/control.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import RequireAttributes from 'linx/lib/require-attributes';
77
import { isValidNumber } from 'linx/lib/utils';
88

99
export const CONTROL_TYPE_VOLUME = 'gain';
10+
export const CONTROL_TYPE_LOW_BAND = 'low-band';
11+
export const CONTROL_TYPE_MID_BAND = 'mid-band';
12+
export const CONTROL_TYPE_HIGH_BAND = 'high-band';
1013
export const CONTROL_TYPE_BPM = 'bpm';
1114
export const CONTROL_TYPE_PITCH = 'pitch';
1215
export const CONTROL_TYPE_DELAY_WET = 'delay-wet';
@@ -21,7 +24,10 @@ export const CONTROL_TYPES = [
2124
CONTROL_TYPE_DELAY_WET,
2225
CONTROL_TYPE_DELAY_CUTOFF,
2326
CONTROL_TYPE_FILTER_HIGHPASS_CUTOFF,
24-
CONTROL_TYPE_FILTER_LOWPASS_CUTOFF
27+
CONTROL_TYPE_FILTER_LOWPASS_CUTOFF,
28+
CONTROL_TYPE_LOW_BAND,
29+
CONTROL_TYPE_MID_BAND,
30+
CONTROL_TYPE_HIGH_BAND
2531
];
2632

2733
// Interface for Automatable Controls
@@ -49,6 +55,10 @@ export default function(audioParamPath) {
4955
case CONTROL_TYPE_FILTER_HIGHPASS_CUTOFF:
5056
case CONTROL_TYPE_FILTER_LOWPASS_CUTOFF:
5157
return d3.scale.log().domain([20, 22050]).range([0, 1]);
58+
case CONTROL_TYPE_LOW_BAND:
59+
case CONTROL_TYPE_MID_BAND:
60+
case CONTROL_TYPE_HIGH_BAND:
61+
return d3.scale.linear().domain([-40, 40]).range([0, 1]);
5262
default:
5363
return d3.scale.identity();
5464
}

app/mixins/playable-arrangement/track-clip.js

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ import {
2323
import {
2424
default as AutomatableClipControlMixin,
2525
CONTROL_TYPE_VOLUME,
26+
CONTROL_TYPE_LOW_BAND,
27+
CONTROL_TYPE_MID_BAND,
28+
CONTROL_TYPE_HIGH_BAND,
2629
CONTROL_TYPE_PITCH,
2730
CONTROL_TYPE_DELAY_WET,
2831
CONTROL_TYPE_DELAY_CUTOFF,
@@ -32,42 +35,63 @@ import {
3235

3336
// TODO(CLEANUP): nest under track-clip/controls/gain?
3437
const TrackVolumeControl = Ember.Object.extend(
35-
AutomatableClipControlMixin('trackVolumeNode.gain'), {
38+
new AutomatableClipControlMixin('trackVolumeNode.gain'), {
3639

3740
type: CONTROL_TYPE_VOLUME,
3841
defaultValue: 1,
3942
});
4043

44+
const TrackLowBandControl = Ember.Object.extend(
45+
new AutomatableClipControlMixin('lowBandEqNode.filter.gain'), {
46+
47+
type: CONTROL_TYPE_LOW_BAND,
48+
defaultValue: 6,
49+
});
50+
51+
const TrackMidBandControl = Ember.Object.extend(
52+
new AutomatableClipControlMixin('midBandEqNode.filter.gain'), {
53+
54+
type: CONTROL_TYPE_MID_BAND,
55+
defaultValue: 6,
56+
});
57+
58+
const TrackHighBandControl = Ember.Object.extend(
59+
new AutomatableClipControlMixin('highBandEqNode.filter.gain'), {
60+
61+
type: CONTROL_TYPE_HIGH_BAND,
62+
defaultValue: 6,
63+
});
64+
4165
const TrackPitchControl = Ember.Object.extend(
42-
AutomatableClipControlMixin('soundtouchNode.pitch'), {
66+
new AutomatableClipControlMixin('soundtouchNode.pitch'), {
4367

4468
type: CONTROL_TYPE_PITCH,
4569
defaultValue: 0,
4670
});
4771

4872
const TrackDelayWetControl = Ember.Object.extend(
49-
AutomatableClipControlMixin('tunaDelayNode.wet.gain'), {
73+
new AutomatableClipControlMixin('tunaDelayNode.wet.gain'), {
5074

5175
type: CONTROL_TYPE_DELAY_WET,
5276
defaultValue: 0,
5377
});
5478

5579
const TrackDelayCutoffControl = Ember.Object.extend(
56-
AutomatableClipControlMixin('tunaDelayNode.filter.frequency'), {
80+
new AutomatableClipControlMixin('tunaDelayNode.filter.frequency'), {
5781

5882
type: CONTROL_TYPE_DELAY_CUTOFF,
5983
defaultValue: 2000,
6084
});
6185

6286
const TrackHighpassFilterCutoffControl = Ember.Object.extend(
63-
AutomatableClipControlMixin('tunaHighpassFilterNode.filter.frequency'), {
87+
new AutomatableClipControlMixin('tunaHighpassFilterNode.filter.frequency'), {
6488

6589
type: CONTROL_TYPE_FILTER_HIGHPASS_CUTOFF,
6690
defaultValue: 20,
6791
});
6892

6993
const TrackLowpassFilterCutoffControl = Ember.Object.extend(
70-
AutomatableClipControlMixin('tunaLowpassFilterNode.filter.frequency'), {
94+
new AutomatableClipControlMixin('tunaLowpassFilterNode.filter.frequency'), {
7195

7296
type: CONTROL_TYPE_FILTER_LOWPASS_CUTOFF,
7397
defaultValue: 22050,
@@ -78,7 +102,7 @@ const TrackLowpassFilterCutoffControl = Ember.Object.extend(
78102
export default Ember.Mixin.create(
79103
AutomatableClipMixin,
80104
PlayableClipMixin,
81-
ReadinessMixin('isTrackClipReady'), {
105+
new ReadinessMixin('isTrackClipReady'), {
82106

83107
// required params
84108
track: null,
@@ -95,6 +119,9 @@ export default Ember.Mixin.create(
95119
controls: Ember.computed(function() {
96120
return [
97121
TrackVolumeControl.create({ clip: this }),
122+
TrackLowBandControl.create({ clip: this }),
123+
TrackMidBandControl.create({ clip: this }),
124+
TrackHighBandControl.create({ clip: this }),
98125
TrackPitchControl.create({ clip: this }),
99126
TrackDelayWetControl.create({ clip: this }),
100127
TrackDelayCutoffControl.create({ clip: this }),
@@ -213,17 +240,32 @@ export default Ember.Mixin.create(
213240

214241
trackVolumeNode: computedObject(GainNode, {
215242
'audioContext': 'audioContext',
216-
'outputNode': 'tunaDelayNode.content',
243+
'outputNode': 'lowBandEqNode.content',
217244
}),
218245

219-
quarterNoteDelayTime: Ember.computed('syncBpm', function() {
220-
// return bpmToSpb(this.get('syncBpm')) * 1000 * 3 / 4;
221-
return bpmToSpb(this.get('syncBpm')) * 1000;
246+
lowBandFilterType: 'lowshelf',
247+
lowBandEqNode: computedObject(TunaFilterNode, {
248+
'filterType': 'lowBandFilterType',
249+
'frequency': 70,
250+
'gain': 6,
251+
'audioContext': 'audioContext',
252+
'outputNode': 'midBandEqNode.content',
222253
}),
223254

224-
tunaDelayNode: computedObject(TunaDelayNode, {
225-
'bypass': 'delayBypass',
226-
'delayTime': 'quarterNoteDelayTime',
255+
midBandFilterType: 'peaking',
256+
midBandEqNode: computedObject(TunaFilterNode, {
257+
'filterType': 'midBandFilterType',
258+
'frequency': 1000,
259+
'gain': 6,
260+
'audioContext': 'audioContext',
261+
'outputNode': 'highBandEqNode.content',
262+
}),
263+
264+
highBandFilterType: 'highshelf',
265+
highBandEqNode: computedObject(TunaFilterNode, {
266+
'filterType': 'highBandFilterType',
267+
'frequency': 13000,
268+
'gain': 6,
227269
'audioContext': 'audioContext',
228270
'outputNode': 'tunaHighpassFilterNode.content',
229271
}),
@@ -241,6 +283,18 @@ export default Ember.Mixin.create(
241283
'filterType': 'lowpassFilterType',
242284
'frequency': 22050,
243285
'audioContext': 'audioContext',
286+
'outputNode': 'tunaDelayNode.content',
287+
}),
288+
289+
quarterNoteDelayTime: Ember.computed('syncBpm', function() {
290+
// return bpmToSpb(this.get('syncBpm')) * 1000 * 3 / 4;
291+
return bpmToSpb(this.get('syncBpm')) * 1000;
292+
}),
293+
294+
tunaDelayNode: computedObject(TunaDelayNode, {
295+
'bypass': 'delayBypass',
296+
'delayTime': 'quarterNoteDelayTime',
297+
'audioContext': 'audioContext',
244298
'outputNode': 'outputNode.content',
245299
}),
246300

app/models/mix/transition.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import DependentRelationshipMixin from 'linx/mixins/models/dependent-relationshi
99

1010
import {
1111
CONTROL_TYPE_VOLUME,
12+
CONTROL_TYPE_LOW_BAND,
13+
CONTROL_TYPE_MID_BAND,
14+
CONTROL_TYPE_HIGH_BAND,
1215
CONTROL_TYPE_DELAY_WET,
1316
CONTROL_TYPE_DELAY_CUTOFF,
1417
CONTROL_TYPE_FILTER_HIGHPASS_CUTOFF,
@@ -69,6 +72,18 @@ export default DS.Model.extend(
6972
controlType: CONTROL_TYPE_VOLUME,
7073
transition: this,
7174
});
75+
const fromTrackLowBandClip = store.createRecord('mix/transition/from-track-automation-clip', {
76+
controlType: CONTROL_TYPE_LOW_BAND,
77+
transition: this,
78+
});
79+
const fromTrackMidBandClip = store.createRecord('mix/transition/from-track-automation-clip', {
80+
controlType: CONTROL_TYPE_MID_BAND,
81+
transition: this,
82+
});
83+
const fromTrackHighBandClip = store.createRecord('mix/transition/from-track-automation-clip', {
84+
controlType: CONTROL_TYPE_HIGH_BAND,
85+
transition: this,
86+
});
7287
const fromTrackDelayWetClip = store.createRecord('mix/transition/from-track-automation-clip', {
7388
controlType: CONTROL_TYPE_DELAY_WET,
7489
transition: this,
@@ -85,10 +100,23 @@ export default DS.Model.extend(
85100
controlType: CONTROL_TYPE_FILTER_LOWPASS_CUTOFF,
86101
transition: this,
87102
});
103+
88104
const toTrackVolumeClip = store.createRecord('mix/transition/to-track-automation-clip', {
89105
controlType: CONTROL_TYPE_VOLUME,
90106
transition: this,
91107
});
108+
const toTrackLowBandClip = store.createRecord('mix/transition/to-track-automation-clip', {
109+
controlType: CONTROL_TYPE_LOW_BAND,
110+
transition: this,
111+
});
112+
const toTrackMidBandClip = store.createRecord('mix/transition/to-track-automation-clip', {
113+
controlType: CONTROL_TYPE_MID_BAND,
114+
transition: this,
115+
});
116+
const toTrackHighBandClip = store.createRecord('mix/transition/to-track-automation-clip', {
117+
controlType: CONTROL_TYPE_HIGH_BAND,
118+
transition: this,
119+
});
92120
const toTrackHighpassCutoffClip = store.createRecord('mix/transition/to-track-automation-clip', {
93121
controlType: CONTROL_TYPE_FILTER_HIGHPASS_CUTOFF,
94122
transition: this,
@@ -100,6 +128,9 @@ export default DS.Model.extend(
100128

101129
const fromTrackAutomationClips = [
102130
fromTrackVolumeClip,
131+
fromTrackLowBandClip,
132+
fromTrackMidBandClip,
133+
fromTrackHighBandClip,
103134
fromTrackDelayWetClip,
104135
fromTrackDelayCutoffClip,
105136
fromTrackHighpassCutoffClip,
@@ -108,6 +139,9 @@ export default DS.Model.extend(
108139

109140
const toTrackAutomationClips = [
110141
toTrackVolumeClip,
142+
toTrackLowBandClip,
143+
toTrackMidBandClip,
144+
toTrackHighBandClip,
111145
toTrackHighpassCutoffClip,
112146
toTrackLowpassCutoffClip
113147
];
@@ -125,6 +159,25 @@ export default DS.Model.extend(
125159
direction: -1
126160
}));
127161

162+
fromTrackLowBandClip.addControlPoints(generateControlPointParams({
163+
startValue: 6,
164+
endValue: 6,
165+
n: volumeControlPointCount,
166+
beatCount,
167+
}));
168+
fromTrackMidBandClip.addControlPoints(generateControlPointParams({
169+
startValue: 6,
170+
endValue: 6,
171+
n: volumeControlPointCount,
172+
beatCount,
173+
}));
174+
fromTrackHighBandClip.addControlPoints(generateControlPointParams({
175+
startValue: 6,
176+
endValue: 6,
177+
n: volumeControlPointCount,
178+
beatCount,
179+
}));
180+
128181
fromTrackHighpassCutoffClip.addControlPoints(generateControlPointParams({
129182
startValue: 20,
130183
endValue: 20,
@@ -176,6 +229,25 @@ export default DS.Model.extend(
176229
direction: 1
177230
}));
178231

232+
toTrackLowBandClip.addControlPoints(generateControlPointParams({
233+
startValue: 6,
234+
endValue: 6,
235+
n: volumeControlPointCount,
236+
beatCount,
237+
}));
238+
toTrackMidBandClip.addControlPoints(generateControlPointParams({
239+
startValue: 6,
240+
endValue: 6,
241+
n: volumeControlPointCount,
242+
beatCount,
243+
}));
244+
toTrackHighBandClip.addControlPoints(generateControlPointParams({
245+
startValue: 6,
246+
endValue: 6,
247+
n: volumeControlPointCount,
248+
beatCount,
249+
}));
250+
179251
toTrackHighpassCutoffClip.addControlPoints(generateControlPointParams({
180252
startValue: 20,
181253
endValue: 20,

0 commit comments

Comments
 (0)