root/lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscillator.as @ 26077

Revision 26077, 8.1 kB (checked in by tekisuke, 6 years ago)

lang/actionscript/flmml/: ノイズの周波数が設定できなくなってました・・・。

Line 
1package com.txt_nifty.sketch.flmml {
2    /**
3     * This class was created based on "ToneGenerator.as".
4       The original code is in "nu.mine.flashnet.sound.synthesis".
5       See following URL; http://www.flexiblefactory.co.uk
6       Thanks to his great works!
7     */
8    import __AS3__.vec.Vector;
9
10    public class MOscillator {
11        public static const SINE:int       = 0;
12        public static const SAW:int        = 1;
13        public static const TRIANGLE:int   = 2;
14        public static const PULSE:int      = 3;
15        public static const NOISE:int      = 4;
16        public static const TRIANGLE16:int = 5;
17        public static const FC_NOISE:int   = 6;
18        public static const FC_S_NOISE:int = 7;
19        public static const GB_NOISE:int   = 8;
20        public static const GB_S_NOISE:int = 9;
21        public static const MAX:int        = 5; // ��@5�ȍ~�͂܂������Ă����܂��B
22        public static const TABLE_LEN:int = 1 << 16;
23        public static const PHASE_LEN:int = 1 << 24;
24        public static const PHASE_HLF:int = (1 << 23);
25        public static const PHASE_SFT:int = 8;
26        public static const PHASE_MSK:int = (1 << 24) - 1;
27        public static const TRI16_TABLE_LEN:int = (1 << 5);
28
29        protected var m_form:int;
30        protected var m_frequency:Number;
31        protected var m_noiseFreq:Number;
32        protected var m_phase:int;
33        protected var m_pwm:int;
34        protected var m_fcr:int;
35        protected static var   s_init:int = 0;
36        protected static var   s_sinTable:Vector.<Number> = new Vector.<Number>(TABLE_LEN);
37        protected static var   s_rndTable:Vector.<Number> = new Vector.<Number>(TABLE_LEN);
38        protected static var   s_tri16Table:Vector.<Number> = new Vector.<Number>(TRI16_TABLE_LEN);
39
40        public function MOscillator() {
41            boot();
42            setForm(PULSE);
43            setFrequency(440.0);
44            setNoiseFreq(1.0);
45            resetPhase();
46            setPWM(0.5);
47            m_fcr = 0x8000;
48        }
49
50        public static function boot():void {
51            if (!s_init) {
52                var d:Number = 2.0 * Math.PI / TABLE_LEN;
53                var p:Number = 0.0;
54                var i:int;
55                for(i = 0; i < TABLE_LEN; i++) {
56                    s_sinTable[i] = Math.sin(p);
57                    p += d;
58                }
59                for(i = 0; i < TABLE_LEN; i++) {
60                    s_rndTable[i] = Math.random() * 2.0 - 1.0;
61                }
62                for(i = 0; i < 16; i++) {
63                    s_tri16Table[i] = s_tri16Table[31 - i] = Number(i) / 15.0 - 0.5;
64                }
65                s_init = 1;
66            }
67        }
68
69        public function setForm(form:int):void {
70            if (form >= MAX) form = MAX-1;
71            if (form == NOISE) m_frequency = m_noiseFreq;
72            m_form = form;
73        }
74
75        protected function getNextSampleValue(phase:int):Number {
76            switch(m_form) {
77            case SINE:
78                return Number(s_sinTable[phase >> PHASE_SFT]);
79            case SAW:
80                return Number(phase) * (2.0 / PHASE_LEN) - 1.0;
81            case TRIANGLE:
82                return ((phase < PHASE_HLF)
83                        ? (PHASE_LEN - 4 * phase) : (PHASE_LEN - 4 * (PHASE_LEN - phase))) / PHASE_LEN;
84            case PULSE:
85                return (phase < m_pwm) ? 1.0 : -1.0;
86            case NOISE:
87                return Number(s_rndTable[phase >> PHASE_SFT]);
88            case TRIANGLE16:
89                return s_tri16Table[phase >> (PHASE_SFT+11)];
90            }
91            return 0.0;
92        }
93
94        public function getNextSample():Number {
95            var val:Number = getNextSampleValue(m_phase);
96            m_phase = (m_phase + m_frequency) & PHASE_MSK;
97            return val;
98        }
99
100        public function getNextSampleOfs(ofs:int):Number {
101            var val:Number = getNextSampleValue((m_phase + ofs) & PHASE_MSK);
102            m_phase = (m_phase + m_frequency) & PHASE_MSK;
103            return val;
104        }
105
106        public function getSamples(samples:Vector.<Number>, start:int, end:int):void {
107            var i:int;
108            switch(m_form) {
109            case SINE:
110                for(i = start; i < end; i++) {
111                    samples[i] = s_sinTable[m_phase >> PHASE_SFT];
112                    m_phase = (m_phase + m_frequency) & PHASE_MSK;
113                }
114                break;
115            case SAW:
116                for(i = start; i < end; i++) {
117                    samples[i] = Number(m_phase) * (2.0 / PHASE_LEN) - 1.0
118                        m_phase = (m_phase + m_frequency) & PHASE_MSK;
119                }
120                break;
121            case TRIANGLE:
122                for(i = start; i < end; i++) {
123                    samples[i] = ((m_phase < PHASE_HLF)
124                                  ? (PHASE_LEN - 4 * m_phase) : (PHASE_LEN - 4 * (PHASE_LEN - m_phase))) * (1.0 / PHASE_LEN);
125                    m_phase = (m_phase + m_frequency) & PHASE_MSK;
126                }
127                break;
128            case PULSE:
129                for(i = start; i < end; i++) {
130                    samples[i] = (m_phase < m_pwm) ? 1.0 : -1.0;
131                    m_phase = (m_phase + m_frequency) & PHASE_MSK;
132                 }
133                break;
134            case NOISE:
135                for(i = start; i < end; i++) {
136                    samples[i] = s_rndTable[m_phase >> PHASE_SFT];
137                    m_phase = (m_phase + m_frequency) & PHASE_MSK;
138                }
139                break;
140            case TRIANGLE16:
141                for(i = start; i < end; i++) {
142                    samples[i] = s_tri16Table[m_phase >> (PHASE_SFT+11)];
143                    m_phase = (m_phase + m_frequency) & PHASE_MSK;
144                }
145                break;
146            case FC_NOISE:
147                for(i = start; i < end; i++) {
148                    m_fcr >>= 1;
149                    m_fcr |= ((m_fcr ^(m_fcr >> 1)) & 1) << 15;
150                    samples[i] = m_fcr & 1;
151                }
152                break;
153            case FC_S_NOISE:
154                for(i = start; i < end; i++) {
155                    m_fcr >>= 1;
156                    m_fcr |= ((m_fcr ^(m_fcr >> 6)) & 1) << 15;
157                    samples[i] = m_fcr & 1;
158                }
159                break;
160            }
161        }
162
163        public function resetPhase():void {
164            m_phase = 0;
165        }
166
167        public function getFrequency():Number {
168            return m_frequency;
169        }
170
171        public function setFrequency(frequency:Number):void {
172            if (m_form != NOISE) m_frequency = frequency * (PHASE_LEN / MSequencer.RATE44100);
173        }
174
175        public function setNoiseFreq(frequency:Number):void {
176            m_noiseFreq = frequency * (1<<PHASE_SFT);
177            if (m_form == NOISE) m_frequency = m_noiseFreq;
178        }
179
180        public function setPWM(pwm:Number):void {
181            m_pwm = pwm * PHASE_LEN;
182        }
183    }
184}
185/*
186  FC�m�C�Y
187 
188  //���W�X�^�̏���  reg = 0x8000;
189
190  //�ȉ����s����B
191  //�@shortFreq�́A�Z����O�B1�ɂ����L����
192  //�@����������tput�̒l���A�m�C�Y�`�����l���̔g�`�B
193  reg >>= 1;
194  reg |= ((reg ^ (reg >> (shortFreq ? 6 : 1))) & 1) << 15;
195  output = reg & 1;
196
197�l �^�C�}���N�^�[�u �X�P�[��
198-----------------------------------
199  $0   $004       15  A
200  $1   $008       14  A
201  $2   $010       13  A
202  $3   $020       12  A
203  $4   $040       11  A
204  $5   $060       11  D
205  $6   $080       10  A
206  $7   $0A0       10  F
207  $8   $0CA       10  C
208  $9   $0FE        9  A
209  $A   $17C        9  D
210  $B   $1FC        8  A
211  $C   $2FA        8  D
212  $D   $3F8        7  A
213  $E   $7F2        6  A
214  $F   $FE4        5  A
215*/
216/*
217  GB�m�C�Y
218
219  //���W�X�^�̏���  reg = 0xffff;
220  output = 1;
221
222  //�ȉ����s����B
223  //�@shortFreq�́A�Z����O�B1�ɂ����L����
224  //�@����������tput�̒l���A�m�C�Y�`�����l���̔g�`�B
225  if(reg == 0)reg = 1; //�ꉞ
226  reg += reg + (((reg >> (shortFreq ? 6 : 14)) ^ (reg >> (shortFreq ? 5 : 13))) & 1);
227  output ^= reg & 1;
228 */
Note: See TracBrowser for help on using the browser.