1
- // Copyright (c) 2016 Patrick Dowling, Tim Churches
2
1
//
3
2
// Initial app implementation: Patrick Dowling ([email protected] )
4
3
// Modifications by: Tim Churches ([email protected] )
@@ -316,33 +315,34 @@ public:
316
315
return 0 ;
317
316
}
318
317
319
- inline void apply_cv_mapping (EnvelopeSettings cv_setting, const int32_t cvs[ADC_CHANNEL_LAST], int32_t segments[kMaxSegments + kEuclideanParams + kDelayParams + kAmplitudeParams ]) {
318
+ inline void apply_cv_mapping (EnvelopeSettings cv_setting, const int32_t cvs[ADC_CHANNEL_LAST], int32_t segments[CV_MAPPING_LAST]) {
319
+ // segments is indexed directly with CVMapping enum values
320
320
int mapping = values_[cv_setting];
321
321
switch (mapping) {
322
322
case CV_MAPPING_SEG1:
323
323
case CV_MAPPING_SEG2:
324
324
case CV_MAPPING_SEG3:
325
325
case CV_MAPPING_SEG4:
326
- segments[mapping - CV_MAPPING_SEG1 ] += (cvs[cv_setting - ENV_SETTING_CV1] * 65536 ) >> 12 ;
326
+ segments[mapping] += (cvs[cv_setting - ENV_SETTING_CV1] * 65536 ) >> 12 ;
327
327
break ;
328
328
case CV_MAPPING_ADR:
329
- segments[CV_MAPPING_SEG1 - CV_MAPPING_SEG1 ] += (cvs[cv_setting - ENV_SETTING_CV1] * 65536 ) >> 12 ;
330
- segments[CV_MAPPING_SEG2 - CV_MAPPING_SEG1 ] += (cvs[cv_setting - ENV_SETTING_CV1] * 65536 ) >> 12 ;
331
- segments[CV_MAPPING_SEG4 - CV_MAPPING_SEG1 ] += (cvs[cv_setting - ENV_SETTING_CV1] * 65536 ) >> 12 ;
329
+ segments[CV_MAPPING_SEG1] += (cvs[cv_setting - ENV_SETTING_CV1] * 65536 ) >> 12 ;
330
+ segments[CV_MAPPING_SEG2] += (cvs[cv_setting - ENV_SETTING_CV1] * 65536 ) >> 12 ;
331
+ segments[CV_MAPPING_SEG4] += (cvs[cv_setting - ENV_SETTING_CV1] * 65536 ) >> 12 ;
332
332
break ;
333
333
case CV_MAPPING_EUCLIDEAN_LENGTH:
334
334
case CV_MAPPING_EUCLIDEAN_FILL:
335
335
case CV_MAPPING_EUCLIDEAN_OFFSET:
336
- segments[mapping - CV_MAPPING_SEG1 ] += cvs[cv_setting - ENV_SETTING_CV1] >> 6 ;
336
+ segments[mapping] += cvs[cv_setting - ENV_SETTING_CV1] >> 6 ;
337
337
break ;
338
338
case CV_MAPPING_DELAY_MSEC:
339
- segments[mapping - CV_MAPPING_SEG1 ] += cvs[cv_setting - ENV_SETTING_CV1] >> 2 ;
339
+ segments[mapping] += cvs[cv_setting - ENV_SETTING_CV1] >> 2 ;
340
340
break ;
341
341
case CV_MAPPING_AMPLITUDE:
342
- segments[mapping - CV_MAPPING_SEG1 ] += cvs[cv_setting - ENV_SETTING_CV1] << 5 ;
342
+ segments[mapping] += cvs[cv_setting - ENV_SETTING_CV1] << 5 ;
343
343
break ;
344
344
case CV_MAPPING_MAX_LOOPS:
345
- segments[mapping - CV_MAPPING_SEG1 ] += cvs[cv_setting - ENV_SETTING_CV1] << 2 ;
345
+ segments[mapping] += cvs[cv_setting - ENV_SETTING_CV1] << 2 ;
346
346
break ;
347
347
default :
348
348
break ;
@@ -419,53 +419,55 @@ public:
419
419
420
420
template <DAC_CHANNEL dac_channel>
421
421
void Update (uint32_t triggers, uint32_t internal_trigger_mask, const int32_t cvs[ADC_CHANNEL_LAST]) {
422
- int32_t s[kMaxSegments + kEuclideanParams + kDelayParams + kAmplitudeParams ];
423
- s[0 ] = SCALE8_16 (static_cast <int32_t >(get_segment_value (0 )));
424
- s[1 ] = SCALE8_16 (static_cast <int32_t >(get_segment_value (1 )));
425
- s[2 ] = SCALE8_16 (static_cast <int32_t >(get_segment_value (2 )));
426
- s[3 ] = SCALE8_16 (static_cast <int32_t >(get_segment_value (3 )));
427
- s[4 ] = static_cast <int32_t >(get_euclidean_length ());
428
- s[5 ] = static_cast <int32_t >(get_euclidean_fill ());
429
- s[6 ] = static_cast <int32_t >(get_euclidean_offset ());
430
- s[7 ] = get_trigger_delay_ms ();
431
- s[8 ] = get_amplitude ();
432
- s[9 ] = get_max_loops ();
422
+ int32_t s[CV_MAPPING_LAST];
423
+ s[CV_MAPPING_NONE] = 0 ; // unused, but needs a placeholder to align with enum CVMapping
424
+ s[CV_MAPPING_SEG1] = SCALE8_16 (static_cast <int32_t >(get_segment_value (0 )));
425
+ s[CV_MAPPING_SEG2] = SCALE8_16 (static_cast <int32_t >(get_segment_value (1 )));
426
+ s[CV_MAPPING_SEG3] = SCALE8_16 (static_cast <int32_t >(get_segment_value (2 )));
427
+ s[CV_MAPPING_SEG4] = SCALE8_16 (static_cast <int32_t >(get_segment_value (3 )));
428
+ s[CV_MAPPING_ADR] = 0 ; // unused, but needs a placeholder to align with enum CVMapping
429
+ s[CV_MAPPING_EUCLIDEAN_LENGTH] = static_cast <int32_t >(get_euclidean_length ());
430
+ s[CV_MAPPING_EUCLIDEAN_FILL] = static_cast <int32_t >(get_euclidean_fill ());
431
+ s[CV_MAPPING_EUCLIDEAN_OFFSET] = static_cast <int32_t >(get_euclidean_offset ());
432
+ s[CV_MAPPING_DELAY_MSEC] = get_trigger_delay_ms ();
433
+ s[CV_MAPPING_AMPLITUDE] = get_amplitude ();
434
+ s[CV_MAPPING_MAX_LOOPS] = get_max_loops ();
433
435
434
436
apply_cv_mapping (ENV_SETTING_CV1, cvs, s);
435
437
apply_cv_mapping (ENV_SETTING_CV2, cvs, s);
436
438
apply_cv_mapping (ENV_SETTING_CV3, cvs, s);
437
439
apply_cv_mapping (ENV_SETTING_CV4, cvs, s);
438
440
439
- s[0 ] = USAT16 (s[0 ]);
440
- s[1 ] = USAT16 (s[1 ]);
441
- s[2 ] = USAT16 (s[2 ]);
442
- s[3 ] = USAT16 (s[3 ]);
443
- CONSTRAIN (s[4 ], 0 , 31 );
444
- CONSTRAIN (s[5 ], 0 , 32 );
445
- CONSTRAIN (s[6 ], 0 , 32 );
446
- CONSTRAIN (s[7 ], 0 , 65535 );
447
- CONSTRAIN (s[8 ], 0 , 65535 );
448
- CONSTRAIN (s[9 ], 0 , 65535 );
441
+ s[CV_MAPPING_SEG1 ] = USAT16 (s[CV_MAPPING_SEG1 ]);
442
+ s[CV_MAPPING_SEG2 ] = USAT16 (s[CV_MAPPING_SEG2 ]);
443
+ s[CV_MAPPING_SEG3 ] = USAT16 (s[CV_MAPPING_SEG3 ]);
444
+ s[CV_MAPPING_SEG4 ] = USAT16 (s[CV_MAPPING_SEG4 ]);
445
+ CONSTRAIN (s[CV_MAPPING_EUCLIDEAN_LENGTH ], 0 , 31 );
446
+ CONSTRAIN (s[CV_MAPPING_EUCLIDEAN_FILL ], 0 , 32 );
447
+ CONSTRAIN (s[CV_MAPPING_EUCLIDEAN_OFFSET ], 0 , 32 );
448
+ CONSTRAIN (s[CV_MAPPING_DELAY_MSEC ], 0 , 65535 );
449
+ CONSTRAIN (s[CV_MAPPING_AMPLITUDE ], 0 , 65535 );
450
+ CONSTRAIN (s[CV_MAPPING_MAX_LOOPS ], 0 , 65535 );
449
451
450
452
EnvelopeType type = get_type ();
451
453
switch (type) {
452
- case ENV_TYPE_AD: env_.set_ad (s[0 ], s[1 ], 0 , 0 ); break ;
453
- case ENV_TYPE_ADSR: env_.set_adsr (s[0 ], s[1 ], s[2 ]>>1 , s[3 ]); break ;
454
- case ENV_TYPE_ADR: env_.set_adr (s[0 ], s[1 ], s[2 ]>>1 , s[3 ], 0 , 0 ); break ;
455
- case ENV_TYPE_AR: env_.set_ar (s[0 ], s[1 ]); break ;
456
- case ENV_TYPE_ADSAR: env_.set_adsar (s[0 ], s[1 ], s[2 ]>>1 , s[3 ]); break ;
457
- case ENV_TYPE_ADAR: env_.set_adar (s[0 ], s[1 ], s[2 ]>>1 , s[3 ], 0 , 0 ); break ;
458
- case ENV_TYPE_ADL2: env_.set_ad (s[0 ], s[1 ], 0 , 2 ); break ;
459
- case ENV_TYPE_ADRL3: env_.set_adr (s[0 ], s[1 ], s[2 ]>>1 , s[3 ], 0 , 3 ); break ;
460
- case ENV_TYPE_ADL2R: env_.set_adr (s[0 ], s[1 ], s[2 ]>>1 , s[3 ], 0 , 2 ); break ;
461
- case ENV_TYPE_ADARL4: env_.set_adar (s[0 ], s[1 ], s[2 ]>>1 , s[3 ], 0 , 4 ); break ;
462
- case ENV_TYPE_ADAL2R: env_.set_adar (s[0 ], s[1 ], s[2 ]>>1 , s[3 ], 1 , 3 ); break ; // was 2, 4
454
+ case ENV_TYPE_AD: env_.set_ad (s[CV_MAPPING_SEG1 ], s[CV_MAPPING_SEG2 ], 0 , 0 ); break ;
455
+ case ENV_TYPE_ADSR: env_.set_adsr (s[CV_MAPPING_SEG1 ], s[CV_MAPPING_SEG2 ], s[CV_MAPPING_SEG3 ]>>1 , s[CV_MAPPING_SEG4 ]); break ;
456
+ case ENV_TYPE_ADR: env_.set_adr (s[CV_MAPPING_SEG1 ], s[CV_MAPPING_SEG2 ], s[CV_MAPPING_SEG3 ]>>1 , s[CV_MAPPING_SEG4 ], 0 , 0 ); break ;
457
+ case ENV_TYPE_AR: env_.set_ar (s[CV_MAPPING_SEG1 ], s[CV_MAPPING_SEG2 ]); break ;
458
+ case ENV_TYPE_ADSAR: env_.set_adsar (s[CV_MAPPING_SEG1 ], s[CV_MAPPING_SEG2 ], s[CV_MAPPING_SEG3 ]>>1 , s[CV_MAPPING_SEG4 ]); break ;
459
+ case ENV_TYPE_ADAR: env_.set_adar (s[CV_MAPPING_SEG1 ], s[CV_MAPPING_SEG2 ], s[CV_MAPPING_SEG3 ]>>1 , s[CV_MAPPING_SEG4 ], 0 , 0 ); break ;
460
+ case ENV_TYPE_ADL2: env_.set_ad (s[CV_MAPPING_SEG1 ], s[CV_MAPPING_SEG2 ], 0 , 2 ); break ;
461
+ case ENV_TYPE_ADRL3: env_.set_adr (s[CV_MAPPING_SEG1 ], s[CV_MAPPING_SEG2 ], s[CV_MAPPING_SEG3 ]>>1 , s[CV_MAPPING_SEG4 ], 0 , 3 ); break ;
462
+ case ENV_TYPE_ADL2R: env_.set_adr (s[CV_MAPPING_SEG1 ], s[CV_MAPPING_SEG2 ], s[CV_MAPPING_SEG3 ]>>1 , s[CV_MAPPING_SEG4 ], 0 , 2 ); break ;
463
+ case ENV_TYPE_ADARL4: env_.set_adar (s[CV_MAPPING_SEG1 ], s[CV_MAPPING_SEG2 ], s[CV_MAPPING_SEG3 ]>>1 , s[CV_MAPPING_SEG4 ], 0 , 4 ); break ;
464
+ case ENV_TYPE_ADAL2R: env_.set_adar (s[CV_MAPPING_SEG1 ], s[CV_MAPPING_SEG2 ], s[CV_MAPPING_SEG3 ]>>1 , s[CV_MAPPING_SEG4 ], 1 , 3 ); break ; // was 2, 4
463
465
default :
464
466
break ;
465
467
}
466
468
467
469
// set the amplitude
468
- env_.set_amplitude (s[8 ], is_amplitude_sampled ()) ;
470
+ env_.set_amplitude (s[CV_MAPPING_AMPLITUDE ], is_amplitude_sampled ()) ;
469
471
470
472
if (type != last_type_) {
471
473
last_type_ = type;
@@ -488,7 +490,7 @@ public:
488
490
env_.set_release_time_multiplier (get_release_time_multiplier ());
489
491
490
492
// set the looping envelope maximum number of loops
491
- env_.set_max_loops (s[9 ]);
493
+ env_.set_max_loops (s[CV_MAPPING_MAX_LOOPS ]);
492
494
493
495
int trigger_input = get_trigger_input ();
494
496
bool triggered = false ;
@@ -507,9 +509,9 @@ public:
507
509
trigger_display_.Update (1 , triggered || gate_raised_);
508
510
509
511
if (triggered) ++euclidean_counter_;
510
- uint8_t euclidean_length = static_cast <uint8_t >(s[4 ]);
511
- uint8_t euclidean_fill = static_cast <uint8_t >(s[5 ]);
512
- uint8_t euclidean_offset = static_cast <uint8_t >(s[6 ]);
512
+ uint8_t euclidean_length = static_cast <uint8_t >(s[CV_MAPPING_EUCLIDEAN_LENGTH ]);
513
+ uint8_t euclidean_fill = static_cast <uint8_t >(s[CV_MAPPING_EUCLIDEAN_FILL ]);
514
+ uint8_t euclidean_offset = static_cast <uint8_t >(s[CV_MAPPING_EUCLIDEAN_OFFSET ]);
513
515
514
516
// Process Euclidean pattern reset
515
517
uint8_t euclidean_reset_trigger_input = get_euclidean_reset_trigger_input ();
@@ -534,7 +536,7 @@ public:
534
536
if (triggered) {
535
537
TriggerDelayMode delay_mode = get_trigger_delay_mode ();
536
538
// uint32_t delay = get_trigger_delay_ms() * 1000U;
537
- uint32_t delay = static_cast <uint32_t >(s[7 ] * 1000U );
539
+ uint32_t delay = static_cast <uint32_t >(s[CV_MAPPING_DELAY_MSEC ] * 1000U );
538
540
if (delay_mode && delay) {
539
541
triggered = false ;
540
542
if (TRIGGER_DELAY_QUEUE == delay_mode) {
0 commit comments