1 module polyplex.core.audio.effects.vocalmorph;
2 import polyplex.core.audio.effects;
3 import polyplex.core.audio.effect;
4 import openal;
5 
6 enum Phoneme : ALenum {
7     A = AL_VOCAL_MORPHER_PHONEME_A,
8     E = AL_VOCAL_MORPHER_PHONEME_E,
9     I = AL_VOCAL_MORPHER_PHONEME_I,
10     O = AL_VOCAL_MORPHER_PHONEME_O,
11     U = AL_VOCAL_MORPHER_PHONEME_U,
12 
13     AA = AL_VOCAL_MORPHER_PHONEME_AA,
14     AE = AL_VOCAL_MORPHER_PHONEME_AE,
15     AH = AL_VOCAL_MORPHER_PHONEME_AH,
16     AO = AL_VOCAL_MORPHER_PHONEME_AO,
17 
18     EH = AL_VOCAL_MORPHER_PHONEME_EH,
19     ER = AL_VOCAL_MORPHER_PHONEME_ER,
20 
21     IH = AL_VOCAL_MORPHER_PHONEME_IH,
22     IY = AL_VOCAL_MORPHER_PHONEME_IY,
23 
24     UH = AL_VOCAL_MORPHER_PHONEME_UH,
25     UW = AL_VOCAL_MORPHER_PHONEME_UW,
26 
27     B = AL_VOCAL_MORPHER_PHONEME_B,
28     D = AL_VOCAL_MORPHER_PHONEME_D,
29     F = AL_VOCAL_MORPHER_PHONEME_F,
30     G = AL_VOCAL_MORPHER_PHONEME_G,
31     J = AL_VOCAL_MORPHER_PHONEME_J,
32     K = AL_VOCAL_MORPHER_PHONEME_K,
33     L = AL_VOCAL_MORPHER_PHONEME_L,
34     M = AL_VOCAL_MORPHER_PHONEME_M,
35     N = AL_VOCAL_MORPHER_PHONEME_N,
36     P = AL_VOCAL_MORPHER_PHONEME_P,
37     R = AL_VOCAL_MORPHER_PHONEME_R,
38     S = AL_VOCAL_MORPHER_PHONEME_S,
39     T = AL_VOCAL_MORPHER_PHONEME_T,
40     V = AL_VOCAL_MORPHER_PHONEME_V,
41     Z = AL_VOCAL_MORPHER_PHONEME_Z,
42 }
43 
44 /**
45     A 4-band formant filter, allowing to morph vocal-ish texture in to sound.
46 
47     WARNING: Only few *hardware* OpenAL implementations support this currently.
48 */
49 public class VocalMorpherEffect : AudioEffect {
50 public:
51     this() {
52         super(EffectType.VocalMorpher);
53         setupDone();
54     }
55 
56     @property Phoneme PhonemeA() {
57         ALenum val;
58         alGetEffecti(id, AL_VOCAL_MORPHER_PHONEMEA, &val);
59         return cast(Phoneme)val;
60     }
61 
62     @property void PhonemeA(Phoneme val) {
63         alEffecti(id, AL_VOCAL_MORPHER_PHONEMEA, cast(ALuint)val);
64     }
65 
66     @property float TuningA() {
67         ALfloat val;
68         alGetEffectf(id, AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING, &val);
69         return val;
70     }
71 
72     @property void TuningA(ALfloat val) {
73         alEffectf(id, AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING, val);
74     }
75 
76     @property Phoneme PhonemeB() {
77         ALenum val;
78         alGetEffecti(id, AL_VOCAL_MORPHER_PHONEMEB, &val);
79         return cast(Phoneme)val;
80     }
81 
82     @property void PhonemeB(Phoneme val) {
83         alEffecti(id, AL_VOCAL_MORPHER_PHONEMEB, cast(ALuint)val);
84     }
85 
86     @property float TuningB() {
87         ALfloat val;
88         alGetEffectf(id, AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING, &val);
89         return val;
90     }
91 
92     @property void TuningB(ALfloat val) {
93         alEffectf(id, AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING, val);
94     }
95 
96     @property WaveformType Waveform() {
97         ALenum val;
98         alGetEffecti(id, AL_VOCAL_MORPHER_WAVEFORM, &val);
99         return cast(WaveformType)val;
100     }
101 
102     @property void Waveform(WaveformType val) {
103         alEffecti(id, AL_VOCAL_MORPHER_WAVEFORM, cast(ALuint)val);
104     }
105 
106     @property float Rate() {
107         ALfloat val;
108         alGetEffectf(id, AL_VOCAL_MORPHER_RATE, &val);
109         return val;
110     }
111 
112     @property void Rate(ALfloat val) {
113         alEffectf(id, AL_VOCAL_MORPHER_RATE, val);
114     }
115 }