History

remove branching from tri, square, and saw ticks

Matthew Wang committed 6 years ago

Commit bec88f11 parent 293326e3 files · +74 −216Browse files

Unified · Split

3 files
  1. LEAF/Inc/leaf-oscillators.h +11 −8
  2. LEAF/Src/leaf-oscillators.c +51 −203
  3. LEAF_JUCEPlugin/Source/MyTest.cpp +12 −5
LEAF/Inc/leaf-oscillators.h+11−8
@@ -15,6 +15,7 @@ extern "C" { · 14 unmodified lines
15 15
16#include "leaf-math.h"16#include "leaf-math.h"
17#include "leaf-mempool.h"17#include "leaf-mempool.h"
18#include "leaf-tables.h"
18#include "leaf-filters.h"19#include "leaf-filters.h"
19 20
20 /*!21 /*!
@@ -31,7 +32,6 @@ extern "C" { · 10 unmodified lines
31 // Underlying phasor32 // Underlying phasor
32 float phase;33 float phase;
33 float inc,freq;34 float inc,freq;
34
35 } _tCycle;35 } _tCycle;
36 36
37 typedef _tCycle* tCycle;37 typedef _tCycle* tCycle;
@@ -99,7 +99,8 @@ extern "C" { · 61 unmodified lines
99 // Underlying phasor99 // Underlying phasor
100 float phase;100 float phase;
101 float inc,freq;101 float inc,freq;
102 102 TableName oct;
103 float w;
103 } _tTriangle;104 } _tTriangle;
104 105
105 typedef _tTriangle* tTriangle;106 typedef _tTriangle* tTriangle;
@@ -154,7 +155,7 @@ extern "C" { · 48 unmodified lines
154 @param osc A pointer to the relevant tTriangle.155 @param osc A pointer to the relevant tTriangle.
155 @param freq The frequency to set the oscillator to.156 @param freq The frequency to set the oscillator to.
156 */157 */
157 int tTriangle_setFreq (tTriangle* const osc, float freq);158 void tTriangle_setFreq (tTriangle* const osc, float freq);
158 159
159 /*! @} */160 /*! @} */
160 161
@@ -166,7 +167,8 @@ extern "C" { · 5 unmodified lines
166 // Underlying phasor167 // Underlying phasor
167 float phase;168 float phase;
168 float inc,freq;169 float inc,freq;
169 170 TableName oct;
171 float w;
170 } _tSquare;172 } _tSquare;
171 173
172 typedef _tSquare* tSquare;174 typedef _tSquare* tSquare;
@@ -221,7 +223,7 @@ extern "C" { · 48 unmodified lines
221 @param osc A pointer to the relevant tSquare.223 @param osc A pointer to the relevant tSquare.
222 @param freq The frequency to set the oscillator to.224 @param freq The frequency to set the oscillator to.
223 */225 */
224 int tSquare_setFreq (tSquare* const osc, float freq);226 void tSquare_setFreq (tSquare* const osc, float freq);
225 227
226 /*! @} */228 /*! @} */
227 229
@@ -233,7 +235,8 @@ extern "C" { · 5 unmodified lines
233 // Underlying phasor235 // Underlying phasor
234 float phase;236 float phase;
235 float inc,freq;237 float inc,freq;
236 238 TableName oct;
239 float w;
237 } _tSawtooth;240 } _tSawtooth;
238 241
239 typedef _tSawtooth* tSawtooth;242 typedef _tSawtooth* tSawtooth;
@@ -288,7 +291,7 @@ extern "C" { · 48 unmodified lines
288 @param osc A pointer to the relevant tSawtooth.291 @param osc A pointer to the relevant tSawtooth.
289 @param freq The frequency to set the oscillator to.292 @param freq The frequency to set the oscillator to.
290 */293 */
291 int tSawtooth_setFreq (tSawtooth* const osc, float freq);294 void tSawtooth_setFreq (tSawtooth* const osc, float freq);
292 295
293 /*! @} */296 /*! @} */
294 297
@@ -354,7 +357,7 @@ extern "C" { · 59 unmodified lines
354 @param osc A pointer to the relevant tPhasor.357 @param osc A pointer to the relevant tPhasor.
355 @param freq The frequency to set the oscillator to.358 @param freq The frequency to set the oscillator to.
356 */359 */
357 int tPhasor_setFreq (tPhasor* const osc, float freq);360 void tPhasor_setFreq (tPhasor* const osc, float freq);
358 361
359 /*! @} */362 /*! @} */
360 363
LEAF/Src/leaf-oscillators.c+51−203
@@ -6,13 +6,11 @@ · 5 unmodified lines
6 6
7#if _WIN32 || _WIN647#if _WIN32 || _WIN64
8 8
9#include "..\Inc\leaf-tables.h"
10#include "..\Inc\leaf-oscillators.h"9#include "..\Inc\leaf-oscillators.h"
11#include "..\leaf.h"10#include "..\leaf.h"
12 11
13#else12#else
14 13
15#include "../Inc/leaf-tables.h"
16#include "../Inc/leaf-oscillators.h"14#include "../Inc/leaf-oscillators.h"
17#include "../leaf.h"15#include "../leaf.h"
18 16
@@ -51,7 +49,10 @@ void tCycle_setFreq(tCycle* const cy, float freq) · 32 unmodified lines
51{49{
52 _tCycle* c = *cy;50 _tCycle* c = *cy;
53 51
54 c->freq = freq;52 if (freq < 0.0f) c->freq = 0.0f;
53 else if (freq > 20480.0f) c->freq = 20480.0f;
54 else c->freq = freq;
55
55 c->inc = freq * leaf.invSampleRate;56 c->inc = freq * leaf.invSampleRate;
56}57}
57 58
@@ -109,6 +110,7 @@ void tTriangle_initToPool (tTriangle* const cy, tMempool* const mp) · 51 unmodified lines
109 110
110 c->inc = 0.0f;111 c->inc = 0.0f;
111 c->phase = 0.0f;112 c->phase = 0.0f;
113 tTriangle_setFreq(cy, 220);
112}114}
113 115
114void tTriangle_freeFromPool (tTriangle* const cy, tMempool* const mp)116void tTriangle_freeFromPool (tTriangle* const cy, tMempool* const mp)
@@ -119,16 +121,22 @@ void tTriangle_freeFromPool (tTriangle* const cy, tMempool* const mp) · 4 unmodified lines
119 mpool_free(c, m);121 mpool_free(c, m);
120}122}
121 123
122int tTriangle_setFreq(tTriangle* const cy, float freq)124void tTriangle_setFreq(tTriangle* const cy, float freq)
123{125{
124 _tTriangle* c = *cy;126 _tTriangle* c = *cy;
125 127
126 if (freq < 0.0f) freq = 0.0f;128 if (freq < 0.0f) c->freq = 0.0f;
129 else if (freq > 20480.0f) c->freq = 20480.0f;
130 else c->freq = freq;
127 131
128 c->freq = freq;132 c->inc = c->freq * leaf.invSampleRate;
129 c->inc = freq * leaf.invSampleRate;
130 133
131 return 0;134 c->w = c->freq * INV_20;
135 for (c->oct = 0; c->w > 2.0f; c->oct++)
136 {
137 c->w = 0.5f * c->w;
138 }
139 c->w = 2.0f - c->w;
132}140}
133 141
134 142
@@ -141,70 +149,12 @@ float tTriangle_tick(tTriangle* const cy) · 6 unmodified lines
141 while (c->phase >= 1.0f) c->phase -= 1.0f;149 while (c->phase >= 1.0f) c->phase -= 1.0f;
142 150
143 float out = 0.0f;151 float out = 0.0f;
144 float w;
145 152
146 int idx = (int)(c->phase * TRI_TABLE_SIZE);153 int idx = (int)(c->phase * TRI_TABLE_SIZE);
147 154
148 // Wavetable synthesis155 // Wavetable synthesis
149 156 out = __leaf_table_triangle[c->oct+1][idx] +
150 if (c->freq <= 20.0f)157 (__leaf_table_triangle[c->oct][idx] - __leaf_table_triangle[c->oct+1][idx]) * c->w;
151 {
152 out = __leaf_table_triangle[T20][idx];
153 }
154 else if (c->freq <= 40.0f)
155 {
156 w = ((40.0f - c->freq) * INV_20);
157 out = (__leaf_table_triangle[T20][idx] * w) + (__leaf_table_triangle[T40][idx] * (1.0f - w));
158 }
159 else if (c->freq <= 80.0f)
160 {
161 w = ((80.0f - c->freq) * INV_40);
162 out = (__leaf_table_triangle[T40][idx] * w) + (__leaf_table_triangle[T80][idx] * (1.0f - w));
163 }
164 else if (c->freq <= 160.0f)
165 {
166 w = ((160.0f - c->freq) * INV_80);
167 out = (__leaf_table_triangle[T80][idx] * w) + (__leaf_table_triangle[T160][idx] * (1.0f - w));
168 }
169 else if (c->freq <= 320.0f)
170 {
171 w = ((320.0f - c->freq) * INV_160);
172 out = (__leaf_table_triangle[T160][idx] * w) + (__leaf_table_triangle[T320][idx] * (1.0f - w));
173 }
174 else if (c->freq <= 640.0f)
175 {
176 w = ((640.0f - c->freq) * INV_320);
177 out = (__leaf_table_triangle[T320][idx] * w) + (__leaf_table_triangle[T640][idx] * (1.0f - w));
178 }
179 else if (c->freq <= 1280.0f)
180 {
181 w = ((1280.0f - c->freq) * INV_640);
182 out = (__leaf_table_triangle[T640][idx] * w) + (__leaf_table_triangle[T1280][idx] * (1.0f - w));
183 }
184 else if (c->freq <= 2560.0f)
185 {
186 w = ((2560.0f - c->freq) * INV_1280);
187 out = (__leaf_table_triangle[T1280][idx] * w) + (__leaf_table_triangle[T2560][idx] * (1.0f - w));
188 }
189 else if (c->freq <= 5120.0f)
190 {
191 w = ((5120.0f - c->freq) * INV_2560);
192 out = (__leaf_table_triangle[T2560][idx] * w) + (__leaf_table_triangle[T5120][idx] * (1.0f - w));
193 }
194 else if (c->freq <= 10240.0f)
195 {
196 w = ((10240.0f - c->freq) * INV_5120);
197 out = (__leaf_table_triangle[T5120][idx] * w) + (__leaf_table_triangle[T10240][idx] * (1.0f - w));
198 }
199 else if (c->freq <= 20480.0f)
200 {
201 w = ((20480.0f - c->freq) * INV_10240);
202 out = (__leaf_table_triangle[T10240][idx] * w) + (__leaf_table_triangle[T20480][idx] * (1.0f - w));
203 }
204 else
205 {
206 out = __leaf_table_triangle[T20480][idx];
207 }
208 158
209 return out;159 return out;
210}160}
@@ -235,6 +185,7 @@ void tSquare_initToPool (tSquare* const cy, tMempool* const mp) · 24 unmodified lines
235 185
236 c->inc = 0.0f;186 c->inc = 0.0f;
237 c->phase = 0.0f;187 c->phase = 0.0f;
188 tSquare_setFreq(cy, 220);
238}189}
239 190
240void tSquare_freeFromPool(tSquare* const cy, tMempool* const mp)191void tSquare_freeFromPool(tSquare* const cy, tMempool* const mp)
@@ -245,16 +196,22 @@ void tSquare_freeFromPool(tSquare* const cy, tMempool* const mp) · 4 unmodified lines
245 mpool_free(c, m);196 mpool_free(c, m);
246}197}
247 198
248int tSquare_setFreq(tSquare* const cy, float freq)199void tSquare_setFreq(tSquare* const cy, float freq)
249{200{
250 _tSquare* c = *cy;201 _tSquare* c = *cy;
251 202
252 if (freq < 0.0f) freq = 0.0f;203 if (freq < 0.0f) c->freq = 0.0f;
204 else if (freq > 20480.0f) c->freq = 20480.0f;
205 else c->freq = freq;
253 206
254 c->freq = freq;207 c->inc = c->freq * leaf.invSampleRate;
255 c->inc = freq * leaf.invSampleRate;
256 208
257 return 0;209 c->w = c->freq * INV_20;
210 for (c->oct = 0; c->w > 2.0f; c->oct++)
211 {
212 c->w = 0.5f * c->w;
213 }
214 c->w = 2.0f - c->w;
258}215}
259 216
260float tSquare_tick(tSquare* const cy)217float tSquare_tick(tSquare* const cy)
@@ -266,69 +223,12 @@ float tSquare_tick(tSquare* const cy) · 5 unmodified lines
266 while (c->phase >= 1.0f) c->phase -= 1.0f;223 while (c->phase >= 1.0f) c->phase -= 1.0f;
267 224
268 float out = 0.0f;225 float out = 0.0f;
269 float w = 0.0f;226
270 int idx = (int)(c->phase * TRI_TABLE_SIZE);227 int idx = (int)(c->phase * TRI_TABLE_SIZE);
271 228
272 // Wavetable synthesis229 // Wavetable synthesis
273 230 out = __leaf_table_squarewave[c->oct+1][idx] +
274 if (c->freq <= 20.0f)231 (__leaf_table_squarewave[c->oct][idx] - __leaf_table_squarewave[c->oct+1][idx]) * c->w;
275 {
276 out = __leaf_table_squarewave[T20][idx];
277 }
278 else if (c->freq <= 40.0f)
279 {
280 w = ((40.0f - c->freq) * INV_20);
281 out = (__leaf_table_squarewave[T20][idx] * w) + (__leaf_table_squarewave[T40][idx] * (1.0f - w));
282 }
283 else if (c->freq <= 80.0f)
284 {
285 w = ((80.0f - c->freq) * INV_40);
286 out = (__leaf_table_squarewave[T40][idx] * w) + (__leaf_table_squarewave[T80][idx] * (1.0f - w));
287 }
288 else if (c->freq <= 160.0f)
289 {
290 w = ((160.0f - c->freq) * INV_80);
291 out = (__leaf_table_squarewave[T80][idx] * w) + (__leaf_table_squarewave[T160][idx] * (1.0f - w));
292 }
293 else if (c->freq <= 320.0f)
294 {
295 w = ((320.0f - c->freq) * INV_160);
296 out = (__leaf_table_squarewave[T160][idx] * w) + (__leaf_table_squarewave[T320][idx] * (1.0f - w));
297 }
298 else if (c->freq <= 640.0f)
299 {
300 w = ((640.0f - c->freq) * INV_320);
301 out = (__leaf_table_squarewave[T320][idx] * w) + (__leaf_table_squarewave[T640][idx] * (1.0f - w));
302 }
303 else if (c->freq <= 1280.0f)
304 {
305 w = ((1280.0f - c->freq) * INV_640);
306 out = (__leaf_table_squarewave[T640][idx] * w) + (__leaf_table_squarewave[T1280][idx] * (1.0f - w));
307 }
308 else if (c->freq <= 2560.0f)
309 {
310 w = ((2560.0f - c->freq) * INV_1280);
311 out = (__leaf_table_squarewave[T1280][idx] * w) + (__leaf_table_squarewave[T2560][idx] * (1.0f - w));
312 }
313 else if (c->freq <= 5120.0f)
314 {
315 w = ((5120.0f - c->freq) * INV_2560);
316 out = (__leaf_table_squarewave[T2560][idx] * w) + (__leaf_table_squarewave[T5120][idx] * (1.0f - w));
317 }
318 else if (c->freq <= 10240.0f)
319 {
320 w = ((10240.0f - c->freq) * INV_5120);
321 out = (__leaf_table_squarewave[T5120][idx] * w) + (__leaf_table_squarewave[T10240][idx] * (1.0f - w));
322 }
323 else if (c->freq <= 20480.0f)
324 {
325 w = ((20480.0f - c->freq) * INV_10240);
326 out = (__leaf_table_squarewave[T10240][idx] * w) + (__leaf_table_squarewave[T20480][idx] * (1.0f - w));
327 }
328 else
329 {
330 out = __leaf_table_squarewave[T20480][idx];
331 }
332 232
333 return out;233 return out;
334}234}
@@ -359,6 +259,7 @@ void tSawtooth_initToPool (tSawtooth* const cy, tMempool* const mp) · 24 unmodified lines
359 259
360 c->inc = 0.0f;260 c->inc = 0.0f;
361 c->phase = 0.0f;261 c->phase = 0.0f;
262 tSawtooth_setFreq(cy, 220);
362}263}
363 264
364void tSawtooth_freeFromPool (tSawtooth* const cy, tMempool* const mp)265void tSawtooth_freeFromPool (tSawtooth* const cy, tMempool* const mp)
@@ -369,16 +270,22 @@ void tSawtooth_freeFromPool (tSawtooth* const cy, tMempool* const mp) · 4 unmodified lines
369 mpool_free(c, m);270 mpool_free(c, m);
370}271}
371 272
372int tSawtooth_setFreq(tSawtooth* const cy, float freq)273void tSawtooth_setFreq(tSawtooth* const cy, float freq)
373{274{
374 _tSawtooth* c = *cy;275 _tSawtooth* c = *cy;
375 276
376 if (freq < 0.0f) freq = 0.0f;277 if (freq < 0.0f) c->freq = 0.0f;
278 else if (freq > 20480.0f) c->freq = 20480.0f;
279 else c->freq = freq;
377 280
378 c->freq = freq;281 c->inc = c->freq * leaf.invSampleRate;
379 c->inc = freq * leaf.invSampleRate;
380 282
381 return 0;283 c->w = c->freq * INV_20;
284 for (c->oct = 0; c->w > 2.0f; c->oct++)
285 {
286 c->w = 0.5f * c->w;
287 }
288 c->w = 2.0f - c->w;
382}289}
383 290
384float tSawtooth_tick(tSawtooth* const cy)291float tSawtooth_tick(tSawtooth* const cy)
@@ -390,70 +297,12 @@ float tSawtooth_tick(tSawtooth* const cy) · 5 unmodified lines
390 while (c->phase >= 1.0f) c->phase -= 1.0f;297 while (c->phase >= 1.0f) c->phase -= 1.0f;
391 298
392 float out = 0.0f;299 float out = 0.0f;
393 float w;
394 300
395 int idx = (int)(c->phase * TRI_TABLE_SIZE);301 int idx = (int)(c->phase * TRI_TABLE_SIZE);
396 302
397 // Wavetable synthesis303 // Wavetable synthesis
398 304 out = __leaf_table_sawtooth[c->oct+1][idx] +
399 if (c->freq <= 20.0f)305 (__leaf_table_sawtooth[c->oct][idx] - __leaf_table_sawtooth[c->oct+1][idx]) * c->w;
400 {
401 out = __leaf_table_sawtooth[T20][idx];
402 }
403 else if (c->freq <= 40.0f)
404 {
405 w = ((40.0f - c->freq) * INV_20);
406 out = (__leaf_table_sawtooth[T20][idx] * w) + (__leaf_table_sawtooth[T40][idx] * (1.0f - w));
407 }
408 else if (c->freq <= 80.0f)
409 {
410 w = ((80.0f - c->freq) * INV_40);
411 out = (__leaf_table_sawtooth[T40][idx] * w) + (__leaf_table_sawtooth[T80][idx] * (1.0f - w));
412 }
413 else if (c->freq <= 160.0f)
414 {
415 w = ((160.0f - c->freq) * INV_80);
416 out = (__leaf_table_sawtooth[T80][idx] * w) + (__leaf_table_sawtooth[T160][idx] * (1.0f - w));
417 }
418 else if (c->freq <= 320.0f)
419 {
420 w = ((320.0f - c->freq) * INV_160);
421 out = (__leaf_table_sawtooth[T160][idx] * w) + (__leaf_table_sawtooth[T320][idx] * (1.0f - w));
422 }
423 else if (c->freq <= 640.0f)
424 {
425 w = ((640.0f - c->freq) * INV_320);
426 out = (__leaf_table_sawtooth[T320][idx] * w) + (__leaf_table_sawtooth[T640][idx] * (1.0f - w));
427 }
428 else if (c->freq <= 1280.0f)
429 {
430 w = ((1280.0f - c->freq) * INV_640);
431 out = (__leaf_table_sawtooth[T640][idx] * w) + (__leaf_table_sawtooth[T1280][idx] * (1.0f - w));
432 }
433 else if (c->freq <= 2560.0f)
434 {
435 w = ((2560.0f - c->freq) * INV_1280);
436 out = (__leaf_table_sawtooth[T1280][idx] * w) + (__leaf_table_sawtooth[T2560][idx] * (1.0f - w));
437 }
438 else if (c->freq <= 5120.0f)
439 {
440 w = ((5120.0f - c->freq) * INV_2560);
441 out = (__leaf_table_sawtooth[T2560][idx] * w) + (__leaf_table_sawtooth[T5120][idx] * (1.0f - w));
442 }
443 else if (c->freq <= 10240.0f)
444 {
445 w = ((10240.0f - c->freq) * INV_5120);
446 out = (__leaf_table_sawtooth[T5120][idx] * w) + (__leaf_table_sawtooth[T10240][idx] * (1.0f - w));
447 }
448 else if (c->freq <= 20480.0f)
449 {
450 w = ((20480.0f - c->freq) * INV_10240);
451 out = (__leaf_table_sawtooth[T10240][idx] * w) + (__leaf_table_sawtooth[T20480][idx] * (1.0f - w));
452 }
453 else
454 {
455 out = __leaf_table_sawtooth[T20480][idx];
456 }
457 306
458 return out;307 return out;
459}308}
@@ -501,16 +350,15 @@ void tPhasor_freeFromPool(tPhasor* const ph, tMempool* const mp) · 41 unmodified lines
501 mpool_free(p, m);350 mpool_free(p, m);
502}351}
503 352
504int tPhasor_setFreq(tPhasor* const ph, float freq)353void tPhasor_setFreq(tPhasor* const ph, float freq)
505{354{
506 _tPhasor* p = *ph;355 _tPhasor* p = *ph;
507 356
508 if (freq < 0.0f) freq = 0.0f;357 if (freq < 0.0f) p->freq = 0.0f;
358 else if (freq > 20480.0f) p->freq = 20480.0f;
359 else p->freq = freq;
509 360
510 p->freq = freq;
511 p->inc = freq * leaf.invSampleRate;361 p->inc = freq * leaf.invSampleRate;
512
513 return 0;
514}362}
515 363
516float tPhasor_tick(tPhasor* const ph)364float tPhasor_tick(tPhasor* const ph)
LEAF_JUCEPlugin/Source/MyTest.cpp+12−5
@@ -27,6 +27,8 @@ tEnvelope env; · 26 unmodified lines
27 27
28tAutotune at;28tAutotune at;
29 29
30tTriangle tri;
31
30float gain;32float gain;
31float freq;33float freq;
32float dtime;34float dtime;
@@ -43,9 +45,11 @@ void LEAFTest_init (float sampleRate, int blockSize) · 10 unmodified lines
43{45{
44 LEAF_init(sampleRate, blockSize, memory, MSIZE, &getRandomFloat);46 LEAF_init(sampleRate, blockSize, memory, MSIZE, &getRandomFloat);
45 47
46 tNoise_init(&noise, WhiteNoise);48 tTriangle_init(&tri);
47 49
48 tAutotune_init(&at, 1, 1024, 512);50// tNoise_init(&noise, WhiteNoise);
51//
52// tAutotune_init(&at, 1, 1024, 512);
49 53
50// tSVF_init(&bp1, SVFTypeBandpass, 100, 4.0f);54// tSVF_init(&bp1, SVFTypeBandpass, 100, 4.0f);
51// tSVF_init(&bp2, SVFTypeBandpass, 1000, 4.0f);55// tSVF_init(&bp2, SVFTypeBandpass, 1000, 4.0f);
@@ -75,9 +79,12 @@ float LEAFTest_tick (float input) · 23 unmodified lines
75 79
76// return tSampler_tick(&samp);80// return tSampler_tick(&samp);
77 81
78 tAutotune_setFreq(&at, 440.0f, 0);82// tAutotune_setFreq(&at, 440.0f, 0);
83
84// return tAutotune_tick(&at, input)[0];
79 85
80 return tAutotune_tick(&at, input)[0];86 tTriangle_setFreq(&tri, x);
87 return tTriangle_tick(&tri);
81}88}
82 89
83int firstFrame = 1;90int firstFrame = 1;
@@ -93,7 +100,7 @@ void LEAFTest_block (void) · 9 unmodified lines
93 100
94 float val = getSliderValue("mod freq");101 float val = getSliderValue("mod freq");
95 102
96 x = val * 3.5f + 0.5f;103 x = val * -40000.0f + 20000;
97 104
98// a = val * tBuffer_getBufferLength(&buff);105// a = val * tBuffer_getBufferLength(&buff);
99 106

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t