-
Notifications
You must be signed in to change notification settings - Fork 187
/
mozzi_utils.h
103 lines (86 loc) · 2.65 KB
/
mozzi_utils.h
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
/*
* mozzi_utils.h
*
* This file is part of Mozzi.
*
* Copyright 2012-2024 Tim Barrass and the Mozzi Team
*
* Mozzi is licensed under the GNU Lesser General Public Licence (LGPL) Version 2.1 or later.
*
*/
#ifndef UTILS_H_
#define UTILS_H_
#include <Arduino.h>
#include "hardware_defines.h"
// macros for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_UINT8_T(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_UINT8_T(sfr) |= _BV(bit))
#endif
/** @ingroup util
Set digital pin 13 to output for testing timing with an oscilloscope.*/
inline
void setPin13Out()
{
#if IS_AVR()
DDRB |= B00100000;
#else
pinMode(13, OUTPUT);
#endif
}
/** @ingroup util
Set pin 13 high for testing timing with an oscilloscope.*/
inline
void setPin13High()
{
#if IS_AVR()
PORTB |= B00100000;
#else
digitalWrite(13, HIGH);
#endif
}
/** @ingroup util
Set pin 13 low for testing timing with an oscilloscope.*/
inline
void setPin13Low()
{
#if IS_AVR()
PORTB &= B11011111;
#else
digitalWrite(13, LOW);
#endif
}
/** @ingroup util
Given a power of 2, work out the number to shift right by to do a divide by the number, or shift left to multiply.
@param a power of 2, or any other number for that matter
@return the number of trailing zeros on the right hand end
*/
constexpr uint8_t trailingZerosConst(unsigned long v) { return ((v % 2) ? 0 : 1+trailingZerosConst(v >> 1)); }
/* NOTE: previous version of the above is super-nifty, but pulls in software float code on AVR (the platform where it makes a difference), leading to bloat and a compile time warning.
* Sine the only use-case I could find works on a compile-time constant (template-parameter), I added a constexpr function in mozzi_utils.h, instead. I renamed it, too,
* so, we'll learn about any use-case outside of this scope. If there are no reports of breakage, the following can probably be removed for good.
long trailingZeros(unsigned long v) {
// find the number of trailing zeros in v, from http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightFloatCast
// there are faster methods on the bit twiddling site, but this is short
float f = (float)(v & -v); // cast the least significant bit in v to a float
return (*(uint32_t *)&f >> 23) - 0x7f;
}
Here's an alternate, trivial version:
uint8_t trailingZeros(uint16_t v) {
uint8_t ret = 0;
while ((v % 2) == 0) {
v = v >> 1;
++ret;
}
return ret;
} */
/** Convert BPM to milliseconds, which can be used to set the delay between beats for Metronome.
@param bpm beats per minute
*/
constexpr uint16_t BPMtoMillis(float bpm){
//float seconds_per_beat = 60.f/bpm;
return (uint16_t) (((float) 60.f/bpm)*1000);
}
#endif /* UTILS_H_ */