Mozzi  version v2.0
sound synthesis library for Arduino
meta.h
1 /*
2  * meta.h
3  *
4  * This file is part of Mozzi.
5  *
6  * Copyright 2012-2024 Tim Barrass and the Mozzi Team
7  *
8  * Mozzi is licensed under the GNU Lesser General Public Licence (LGPL) Version 2.1 or later.
9  *
10  */
11 
12 /*
13 http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Int-To-Type
14 Template meta-programming extras.
15 */
16 
17 #ifndef META_H_
18 #define META_H_
19 
20 /** @defgroup soundtables Look-up-tables and python scripts to generate tables or convert sounds.
21 
22 Look-up-tables and python scripts to generate tables or convert sounds. Includes ready-to-use wave tables and a few example samples which are in the Mozzi/tables and Mozzi/samples folders. You can convert your own sounds from a program like Audacity to tables for Mozzi with a script called char2mozzi.py, in Mozzi/python. Read the int8_t2mozzi.py file for instructions. Also check out the other scripts in the python folder for templates to use if you want to do your own thing.
23 */
24 
25 /** @defgroup util Utility functions, and debugging
26 
27 Utility functions. Includes functions for debugging and profiling high frequency code with an oscilloscope when serial is too slow, some miscellaneous functions used internally by Mozzi, python scripts for converting or generating sound tables, and assorted meta-programming utils.
28 */
29 
30 /** @ingroup util
31 Enables you to instantiate a template based on an integer value.
32 For example, this is used in StateVariable.h to choose a different next()
33 function for each kind of filter, LOWPASS, BANDPASS, HIGHPASS or NOTCH, which are simple
34 integer values 0,1,2,3 provided to the StateVariable template on instantiation.
35 Fantastic!
36 It's in C++11, but not yet available in avr-gcc.
37 See "c++ enable_if"
38 */
39 template <int I>
40 struct Int2Type
41 {
42  enum {
43  value = I };
44 };
45 
46 
47 /*
48 //from http://en.wikibooks.org/wiki/C%2B%2B_Programming/Templates/Template_Meta-Programming#Compile-time_programming
49 
50 //First, the general (unspecialized) template says that factorial<n>::value is given by n*factorial<n-1>::value:
51 template <unsigned n>
52 struct factorial
53 {
54  enum { value = n * factorial<n-1>::value };
55 };
56 
57 
58 //Next, the specialization for zero says that factorial<0>::value evaluates to 1:
59 template <>
60 struct factorial<0>
61 {
62  enum { value = 1 };
63 };
64 
65 
66 //And now some code that "calls" the factorial template at compile-time:
67 // Because calculations are done at compile-time, they can be
68 // used for things such as array sizes, eg.
69 // int array[ factorial<7>::value ];
70 
71 */
72 
73 #endif /* META_H_ */