-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTODO
121 lines (106 loc) · 4.65 KB
/
TODO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
= tempo =
a) should we rename 'tempo' to 'tempo_sync' or 'song_tempo'?
b) can we remove the iface and use TAGS?
- we already have GST_TAG_BEATS_PER_MINUTE
gst_tag_register (GST_TAG_BEATS_PER_MINUTE, GST_TAG_FLAG_META, G_TYPE_DOUBLE,
_("beats per minute"), _("number of beats per minute in audio"), NULL);
- we need GST_TAG_TICKS_PER_BEAT and GST_TAG_SUBTICKS_PER_TICK
where to register them?
- the main problem with tags instead of an iface is that it is not easy to
change it while playing, we'd need to use the playback rate
c) can we use events?
- the application would push them on to the sink and they travel up to the
sources
= GstBtChildBin =
- would be useful for the GstIirEqualizerNBands (num-bands->children)
= GstSimsyn =
- have more variants in the same plugin (share code, like oszillators and filter)
- we'd like to have one with
- dual-osc (with detune for the 2nd)
- two ADSR envelopes
- each envelope can modulate volume and filter-cutoff/resonance
- current simsyn is missing key-tracking for the filter
- we could add a boolean to enable key-tracking (false by default)
- on cut-off changes we need to base it on the currently played note
- current cut-off range is 0.0->1.0 with 1.0 = srat/2.0
- v1: we could map 1.0 -> note_freq*32.0 (5 harmonics) instead
- v2: we could assume the current cut-off is related to C-4 and rebase
accordingly
= WaveTabSynth =
- slightly modulating the wave-offset could be interesting
- we could e.g. let it progress during the tone or have an envelope for it
= GrainSynth =
- a grain synth takes snippets from the one wave-table slot, applies a
fft-window function and mixes it into the output
- using a triangle-window and a grain-ratio=1.0 would replicate the waveform
(triangles with 50% overlap)
- depending on the ration of note-lnegth and wave-length the overlap and the
grain-ratio would change. The overlap is implicit.
- if note_len>wave_len : add more grains
- else : skip grains
- until now it's merely a form of tiemstreching, to make it more interesting we
can add:
- extra grains at a different volume before and after the actual grain
- volume would be a percentage of the original, spread would be in ms
- grain size, this determines the width of the window, might be fun to make
extra grains smaller too
- panning for extra grains
- one possible way to implement is to have n-'voices' as below
- for this little overlap and spread we already need 7 voices though
- the wider a voice spreads and the smaller the overlap is, the more voices we
need (voices = 1 + (spread_range_ms / overlap_ms)
/\
0 /\ / \ /\
/\
1 /\ / \ /\
/\
2 /\ / \ /\
/\
3 /\ / \ /\
/\
4 /\ / \ /\
/\
5 /\ / \ /\
/\
6 /\ / \ /\
spread_range_ms = 12
overlap_ms = 2
voices = 1 + (12 / 2) = 7
= EBeatz =
- a versatile percussion sound generator
- dual osc
- peak-vol is trigger
1) tonal
- osc with sin, saw, sqr, tri
- start and stop frequency
- linear fade?
- adsr-envelope
- peak-vol relative to main-peak-vol
- filter?
2) noise
- osc with various nose flavours
- ad-envelope
- peak-vol relative to main-peak-vol
- filter
- ad-envelope for cut-off?
- have presets for kick, snare, {open,closed}-hihat, claps, cymbal
= synth components =
The libgstbuzztrax already has a couple of components; we'd like to extend this
to make it dead easy writing new synths.
== components ideas ==
=== osc-wave (wavetable oscillator) ===
- we might need to add some extra caps fields
(root-note, loop, loop-start, loop-end)
- do we want it to play loops?
- what if samples are for e.g. 44100 but the audio plays at 48000?
- we could resample all wave-table entries when loading a song (keeping original
waves in the files)
== design ==
After adding more components we needs to extract common interfaces. Each
component would have a couple of properties and vmethods (start, process, stop).
When using them the element would proxy a few properties and ev. configure
others manually. We can use GBinding (since glib-2.26) for the proxy properties.
== open questions ==
Do we need to pass the data fmt? What about mono/stereo.
= debugging =
G_SLICE=always-malloc G_DEBUG=gc-friendly GLIBCPP_FORCE_NEW=1 GLIBCXX_FORCE_NEW=1 valgrind --tool=memcheck --leak-check=full --leak-resolution=high --trace-children=yes --num-callers=20 --suppressions=$HOME/projects/gstreamer/gstreamer/common/gst.supp gst-launch -q >/dev/null audiotestsrc num-buffers=10 ! bml-EQ-10 ! fakesink