Changeset 38797

Show
Ignore:
Timestamp:
01/17/11 00:17:49 (2 years ago)
Author:
tekisuke
Message:

@aloerinさんの代理コミット。
#USING POLYによるポリフォニック(複数発音)指定が追加されました。
その他、#TITLE, #COMMENT, #ARTIST, #CODINGなど各種情報を埋め込めるようになりました。

Location:
lang/actionscript/flmml/trunk/src
Files:
2 added
17 modified

Legend:

Unmodified
Added
Removed
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/FlMML.as

    r31399 r38797  
    5959            return m_mml.getNowTimeStr(); 
    6060        } 
     61                public function getVoiceCount():int { 
     62                        return m_mml.getVoiceCount(); 
     63                } 
     64        public function getMetaTitle():String { 
     65            return m_mml.getMetaTitle(); 
     66        } 
     67        public function getMetaComment():String { 
     68            return m_mml.getMetaComment(); 
     69        } 
     70        public function getMetaArtist():String { 
     71            return m_mml.getMetaArtist(); 
     72        } 
     73        public function getMetaCoding():String { 
     74            return m_mml.getMetaCoding(); 
     75        }                
    6176    } 
    6277} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MChannel.as

    r38696 r38797  
    22    import __AS3__.vec.Vector; 
    33 
    4     public class MChannel { 
     4    public class MChannel implements IChannel { 
    55        private static const LFO_TARGET_PITCH:int     = 0; 
    66        private static const LFO_TARGET_AMPLITUDE:int = 1; 
     
    5252                private var m_portRate:Number; 
    5353                private var m_lastFreqNo:int; 
     54                 
     55                private var m_slaveVoice:Boolean;       // 従属ボイスか? 
     56        private var m_voiceid:Number;           // ボイスID 
     57                 
    5458 
    5559        public    static var PITCH_RESOLUTION:int = 100; 
     
    101105                        m_portamento = 0; 
    102106                        m_portRate = 0; 
     107                        m_voiceid  = 0; 
     108                        m_slaveVoice = false; 
    103109        } 
    104110        public static function boot(numSamples:int):void { 
     
    107113                s_frequencyLen = s_frequencyMap.length; 
    108114                for(i = 0; i < s_frequencyLen; i++) { 
    109                     s_frequencyMap[i] = 440.0 * Math.pow(2.0, (i-69*PITCH_RESOLUTION)/(12*PITCH_RESOLUTION)); 
     115                    s_frequencyMap[i] = 440.0 * Math.pow(2.0, (i-69*PITCH_RESOLUTION)/(12.0*PITCH_RESOLUTION)); 
    110116                } 
    111117                s_volumeLen = s_volumeMap.length; 
     
    171177            m_oscMod1.setFrequency(getFrequency(m_freqNo)); 
    172178        } 
     179                public function getNoteNo():int { 
     180                        return m_noteNo; 
     181                } 
     182                public function isPlaying():Boolean { 
     183                        return m_envelope1.isPlaying(); 
     184                } 
     185                public function getId():Number { 
     186                        return m_voiceid; 
     187                } 
     188                public function getVoiceCount():int { 
     189                        return isPlaying() ? 1 : 0; 
     190                } 
     191                public function setSlaveVoice(f:Boolean):void { 
     192                        m_slaveVoice = f; 
     193                } 
     194        public function noteOnWidthId(noteNo:int, velocity:int, id:Number):void { 
     195                        m_voiceid = id; 
     196                        noteOn(noteNo, velocity); 
     197                } 
    173198        public function noteOn(noteNo:int, velocity:int):void { 
    174199            setNoteNo(noteNo, false); 
     
    195220                         
    196221        } 
    197         public function noteOff():void { 
    198             m_envelope1.releaseEnvelope(); 
    199             m_envelope2.releaseEnvelope(); 
    200         } 
     222        public function noteOff(noteNo:int):void { 
     223            if (noteNo < 0 || noteNo == m_noteNo) { 
     224                                m_envelope1.releaseEnvelope(); 
     225                                m_envelope2.releaseEnvelope(); 
     226                        } 
     227        } 
     228                public function setSoundOff():void { 
     229                        m_envelope1.soundOff(); 
     230                        m_envelope2.soundOff(); 
     231                } 
    201232        public function close():void { 
    202             noteOff(); 
     233            noteOff(m_noteNo); 
    203234            m_filter.setSwitch(0); 
    204235        } 
     
    209240        public function setForm(form:int, subform:int):void { 
    210241            m_oscMod1 = m_oscSet1.setForm(form); 
    211             if (form == MOscillator.GB_WAVE) (MOscGbWave)(m_oscSet1.getMod(MOscillator.GB_WAVE)).setWaveNo(subform); 
    212                         //2009.05.10 OffGao ADD 1L addDPCM 
    213             if (form == MOscillator.FC_DPCM) (MOscFcDpcm)(m_oscSet1.getMod(MOscillator.FC_DPCM)).setWaveNo(subform); 
    214             if (form == MOscillator.WAVE   ) (MOscWave)(m_oscSet1.getMod(MOscillator.WAVE   )).setWaveNo(subform); 
    215             if (form == MOscillator.SINE   ) (MOscSine)(m_oscSet1.getMod(MOscillator.SINE)).setWaveNo(subform); 
     242                        m_oscMod1.setWaveNo(subform); 
     243//          if (form == MOscillator.GB_WAVE) (MOscGbWave)(m_oscSet1.getMod(MOscillator.GB_WAVE)).setWaveNo(subform); 
     244//                      //2009.05.10 OffGao ADD 1L addDPCM 
     245//          if (form == MOscillator.FC_DPCM) (MOscFcDpcm)(m_oscSet1.getMod(MOscillator.FC_DPCM)).setWaveNo(subform); 
     246//          if (form == MOscillator.WAVE   ) (MOscWave)(m_oscSet1.getMod(MOscillator.WAVE   )).setWaveNo(subform); 
     247//          if (form == MOscillator.SINE   ) (MOscSine)(m_oscSet1.getMod(MOscillator.SINE)).setWaveNo(subform); 
    216248        } 
    217249        public function setEnvelope1Atk(attack:int):void { 
     
    340372                        m_lastFreqNo = base; 
    341373                } 
     374                public function setVoiceLimit(voiceLimit:int) : void { 
     375                        // 無視 
     376                }                
     377                public function reset():void { 
     378                        // 基本 
     379                        setSoundOff(); 
     380                    m_pulseWidth        = 0.5;   
     381            m_voiceid       = 0;                         
     382                        setForm(0, 0); 
     383                        setDetune(0); 
     384                        setExpression(127); 
     385                        setVelocity(100); 
     386                        setPan(64); 
     387                        setVolMode(0); 
     388                        setNoiseFreq(0.0); 
     389                        // LFO 
     390                        setLFOFMSF(0, 0); 
     391                    m_osc2Connect       = 0; 
     392                        m_onCounter             = 0; 
     393                        m_lfoTarget             = 0; 
     394                    m_lfoDelay          = 0; 
     395                    m_lfoDepth          = 0.0; 
     396                    m_lfoEnd            = 0; 
     397                        // フィルタ 
     398                        setLpfSwtAmt(0, 0); 
     399                        setLpfFrqRes(0, 0); 
     400                        setFormant(-1); 
     401                        // パイプ 
     402                        setInput(0, 0); 
     403                        setOutput(0, 0); 
     404                        setRing(0, 0); 
     405                        setSync(0, 0); 
     406                        // ポルタメント 
     407                    m_portDepth     = 0; 
     408                    m_portDepthAdd  = 0; 
     409                    m_lastFreqNo    = 4800; 
     410                    m_portamento    = 0; 
     411                    m_portRate      = 0; 
     412                } 
     413                public function clearOutPipe(max:int, start:int, delta:int):void { 
     414                        var end:int = start + delta; 
     415                        if (end >= max) end = max; 
     416                        if (m_outMode == 1) { 
     417                                for(var i:int = start; i < end; i++) { 
     418                                        s_pipeArr[m_outPipe][i] = 0.0; 
     419                                }                                
     420                        } 
     421                } 
    342422        protected function getNextCutoff():Number { 
    343423            var cut:Number = m_lpfFrq + m_lpfAmt * m_envelope2.getNextAmplitudeLinear(); 
     
    355435            if (end >= max) end = max; 
    356436            var key:Number = getFrequency(m_freqNo); 
    357             if(m_outMode == 1){ 
     437            if(m_outMode == 1 && m_slaveVoice == false){ 
    358438                // @o1 が指定されていれば直接パイプに音声を書き込む 
    359439                trackBuffer = s_pipeArr[m_outPipe]; 
     
    558638                    //trace("output "+m_outPipe); 
    559639                    pipe = s_pipeArr[m_outPipe]; 
    560                     for(i = start; i < end; i++) { 
    561                         pipe[i] = trackBuffer[i]; 
    562                     } 
     640                                        if (m_slaveVoice == false) { 
     641                                                for(i = start; i < end; i++) { 
     642                                                        pipe[i]  = trackBuffer[i]; 
     643                                                } 
     644                                        } 
     645                                        else { 
     646                                                for(i = start; i < end; i++) { 
     647                                                        pipe[i] += trackBuffer[i]; 
     648                                                } 
     649                                        } 
    563650                    break; 
    564651                case 2: // add 
     
    571658            }else if(m_outMode == 1){ 
    572659                pipe = s_pipeArr[m_outPipe]; 
    573                 for(i = start; i < end; i++) { 
    574                     pipe[i] = 0.0; 
    575                 } 
     660                                if (m_slaveVoice == false) { 
     661                                        for(i = start; i < end; i++) { 
     662                                                pipe[i] = 0.0; 
     663                                        } 
     664                                } 
    576665            } 
    577666        } 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MEnvelope.as

    r36869 r38797  
    5050        } 
    5151        public function setRelease(release:Number):void { 
    52                         m_releaseTime = ((release > 0) ? release : (1 / 127)) * MSequencer.RATE44100; 
     52                        m_releaseTime = ((release > 0) ? release : (1.0 / 127.0)) * MSequencer.RATE44100; 
    5353                        // 現在のボリュームなどを設定 
    5454                        if(m_playing && !m_releasing){ 
     
    8787                        m_releasing = true; 
    8888                        m_releaseStep = (m_currentVal / m_releaseTime); 
     89                } 
     90                 
     91                public function soundOff():void { 
     92                        releaseEnvelope(); 
     93                        m_playing = false; 
    8994                } 
    9095                 
     
    214219            return m_playing; 
    215220        } 
     221                public function isReleasing():Boolean { 
     222                        return m_releasing; 
     223                } 
    216224        } 
    217225} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MEvent.as

    r38691 r38797  
    66        private var m_data0:int; 
    77        private var m_data1:int; 
     8                private var m_tick:uint; 
    89        private var TEMPO_SCALE:Number = 100; // bpm小数点第二位まで有効 
    910 
    10         public function MEvent() { 
     11        public function MEvent(tick:uint) { 
    1112            set(MStatus.NOP, 0, 0); 
     13                        setTick(tick); 
    1214        } 
    1315 
     
    5052        public function setSync(mode:int, pipe:int):void      { set(MStatus.SYNC, mode, pipe); } 
    5153        public function setDelta(delta:int):void              { m_delta = delta; } 
     54                public function setTick(tick:uint):void               { m_tick = tick; } 
    5255                public function setPortamento(depth:int, len:int):void { set(MStatus.PORTAMENTO, depth, len); } 
    5356                public function setMidiPort(mode:int):void            { set(MStatus.MIDIPORT, mode, 0); }; 
    5457                public function setMidiPortRate(rate:int):void        { set(MStatus.MIDIPORTRATE, rate, 0); }; 
    5558                public function setPortBase(base:int):void            { set(MStatus.BASENOTE, base, 0); }; 
     59                public function setPoly(voiceCount:int):void              { set(MStatus.POLY, voiceCount, 0); }; 
     60                public function setResetAll():void                                        { set(MStatus.RESET_ALL, 0, 0); } 
     61                public function setSoundOff():void                                        { set(MStatus.SOUND_OFF, 0, 0); } 
    5662        public function getStatus():int     { return m_status; } 
    5763        public function getDelta():int      { return m_delta; } 
     64                public function getTick():uint      { return m_tick;  } 
    5865        public function getNoteNo():int     { return m_data0; } 
    5966        public function getVelocity():int   { return m_data1; } 
     
    97104                public function getMidiPortRate():int { return m_data0; } 
    98105                public function getPortBase():int   { return m_data0; } 
     106                public function getVoiceCount():int { return m_data0; } 
    99107    } 
    100108} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MML.as

    r38691 r38797  
    2828                protected var m_beforeNote:int; 
    2929                protected var m_portamento:int; 
     30                protected var m_usingPoly:Boolean; 
     31                protected var m_polyVoice:int; 
     32                protected var m_polyForce:Boolean; 
     33                protected var m_metaTitle:String; 
     34                protected var m_metaArtist:String; 
     35                protected var m_metaCoding:String; 
     36                protected var m_metaComment:String; 
    3037        protected static var MAX_PIPE:int = 3; 
    3138        protected static var MAX_SYNCSOURCE:int = 3; 
     39                protected static var MAX_POLYVOICE:int = 64; 
    3240 
    3341        public function MML() { 
     
    210218            case 'p': // Pan 
    211219                next(); 
    212                 o = getUInt(64); 
    213                 if (o < 1) o = 1; 
    214                 if (o > 127) o = 127; 
    215                 m_tracks[m_trackNo].recPan(o); 
     220                                if (getChar() == 'l') { // poly mode 
     221                                        next(); 
     222                                        o = getUInt(m_polyVoice); 
     223                                        o = Math.max(0, Math.min(m_polyVoice, o)); 
     224                                        m_tracks[m_trackNo].recPoly(o); 
     225                                } 
     226                                else { 
     227                                        o = getUInt(64); 
     228                                        if (o < 1) o = 1; 
     229                                        if (o > 127) o = 127; 
     230                                        m_tracks[m_trackNo].recPan(o); 
     231                                } 
    216232                break; 
    217233            case '\'': // formant filter 
     
    480496            case "q": // gate time (rate) 
    481497                m_gate = getUInt(m_gate); 
    482                 m_tracks[m_trackNo].recGate(m_gate / m_maxGate); 
     498                m_tracks[m_trackNo].recGate(Number(m_gate) / Number(m_maxGate)); 
    483499                break; 
    484500            case "<" : // octave shift 
     
    510526                    warning(MWarning.UNKNOWN_COMMAND, c + c0); 
    511527                break; 
     528                        case '[': 
     529                                m_tracks[m_trackNo].recChordStart(); 
     530                                break; 
     531                        case ']': 
     532                                m_tracks[m_trackNo].recChordEnd(); 
     533                                break; 
    512534            default: 
    513535                { 
     
    757779        protected function processMacro():void { 
    758780            var i:int; 
    759             // OCTAVE REVERSE 
     781                        var matched:Array; 
     782                        // OCTAVE REVERSE 
    760783            var exp:RegExp = /^#OCTAVE\s+REVERSE\s*$/m; 
    761784            if (m_string.match(exp)) { 
     
    769792                m_velDir = false; 
    770793            } 
     794                        // meta informations 
     795                        { 
     796                                m_metaTitle   = findMetaDesc("TITLE"  );        // #TITLE 
     797                                m_metaArtist  = findMetaDesc("ARTIST" );        // #ARTIST 
     798                                m_metaComment = findMetaDesc("COMMENT");        // #COMMENT 
     799                                m_metaCoding  = findMetaDesc("CODING" );        // #CODING 
     800                                findMetaDesc("PRAGMA"); // #PRAGMA 
     801                        } 
     802                        // POLY MODE 
     803                        { 
     804                                var usePoly:String = findMetaDesc("USING\\s+POLY"); 
     805                                usePoly = usePoly.replace("\r",  ""); 
     806                                usePoly = usePoly.replace("\n", " "); 
     807                                usePoly = usePoly.toLowerCase(); 
     808                                if (usePoly.length > 0) { 
     809                                        var ss:Array = usePoly.split(" "); 
     810                                        if (ss.length < 1) { 
     811                                                m_usingPoly = false; 
     812                                        } 
     813                                        else { 
     814                                                m_usingPoly = true; 
     815                                                m_polyVoice = Math.min(Math.max(1, parseInt(ss[0])), MAX_POLYVOICE); // 1~MAX_POLYVOICE 
     816                                        } 
     817                                        for (i = 1; i < ss.length; i++) { 
     818                                                if (ss[i] == "force") { 
     819                                                        m_polyForce = true; 
     820                                                } 
     821                                        } 
     822                                        if (m_polyVoice <= 1) { 
     823                                                m_usingPoly = false; 
     824                                                m_polyForce = false; 
     825                                        } 
     826                                        // trace("using poly = " + m_usingPoly + ", max voice = " + m_polyVoice + ", force = " + m_polyForce); 
     827                                } 
     828                        } 
    771829            // GB WAVE (ex. "#WAV10 0,0123456789abcdeffedcba9876543210") 
    772830            { 
    773831                exp = /^#WAV10\s.*$/gm; 
    774                 var matched:Array = m_string.match(exp); 
     832                matched = m_string.match(exp); 
    775833                if (matched) { 
    776834                    for(i = 0; i < matched.length; i++) { 
     
    935993            } 
    936994        } 
    937  
     995                 
     996                // 指定されたメタ記述を引き抜いてくる 
     997                protected function findMetaDesc(sectionName:String):String { 
     998            var i:int; 
     999                        var matched:Array; 
     1000                        var mm:Array; 
     1001                        var e1:RegExp; 
     1002                        var e2:RegExp; 
     1003                        var tt:String = ""; 
     1004                         
     1005                        e1 = new RegExp("^#" + sectionName + "(\\s*|\\s+(.*))$", "gm"); // global multi-line 
     1006                        e2 = new RegExp("^#" + sectionName + "(\\s*|\\s+(.*))$",  "m"); //        multi-line 
     1007                         
     1008                        matched = m_string.match(e1); 
     1009                        if (matched) { 
     1010                                m_string = m_string.replace(e1, ""); 
     1011                                for(i = 0; i < matched.length; i++) { 
     1012                                        mm = matched[i].match(e2); 
     1013                                        if (mm.length >= 3) {  
     1014                                                tt += mm[2]; 
     1015                                                if (i + 1 < matched.length) { 
     1016                                                        tt += "\r\n"; 
     1017                                                } 
     1018                                        } 
     1019                                } 
     1020                                // trace(sectionName + " = " + tt); 
     1021                        }                        
     1022                        return tt; 
     1023                }        
     1024                 
    9381025        protected function processComment(str:String):void { 
    9391026            m_string = str; 
     
    11091196                        m_beforeNote = 0; 
    11101197                        m_portamento = 0; 
    1111  
     1198                        m_usingPoly = false; 
     1199                        m_polyVoice = 1; 
     1200                        m_polyForce = false; 
     1201                         
     1202                        m_metaTitle   = ""; 
     1203                        m_metaArtist  = ""; 
     1204                        m_metaCoding  = ""; 
     1205            m_metaComment = ""; 
     1206                         
    11121207            processComment(str); 
    11131208            //trace(m_string+"\n\n"); 
     
    11301225            for(var i:int = MTrack.TEMPO_TRACK; i < m_tracks.length; i++) { 
    11311226                if (i > MTrack.TEMPO_TRACK) { 
     1227                                        if (m_usingPoly && (m_polyForce || m_tracks[i].findPoly())) { 
     1228                                                m_tracks[i].usingPoly(m_polyVoice); 
     1229                                        } 
    11321230                    m_tracks[i].recRestMSec(2000); 
    11331231                    m_tracks[i].recClose(); 
     
    11871285            return m_sequencer.getNowTimeStr(); 
    11881286        } 
     1287        public function getVoiceCount():int { 
     1288                        var i:int; 
     1289                        var c:int = 0; 
     1290            for (i = 0; i < m_tracks.length; i++) { 
     1291                                c += m_tracks[i].getVoiceCount(); 
     1292                        } 
     1293            return c; 
     1294        }                
     1295        public function getMetaTitle():String { 
     1296            return m_metaTitle; 
     1297        } 
     1298        public function getMetaComment():String { 
     1299            return m_metaComment; 
     1300        } 
     1301        public function getMetaArtist():String { 
     1302            return m_metaArtist; 
     1303        } 
     1304        public function getMetaCoding():String { 
     1305            return m_metaCoding; 
     1306        } 
    11891307    } 
    11901308} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscFcDpcm.as

    r35879 r38797  
    111111 
    112112        } 
    113         public function setWaveNo(waveNo:int):void { 
     113        public override function setWaveNo(waveNo:int):void { 
    114114            if (waveNo >= MAX_WAVE) waveNo = MAX_WAVE-1; 
    115115            if (!s_table[waveNo]) waveNo = 0; 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscFcTri.as

    r34488 r38797  
    44    public class MOscFcTri extends MOscMod { 
    55        public static const FC_TRI_TABLE_LEN:int = (1 << 5); 
     6        public static const MAX_WAVE:int = 2; 
    67        protected static var s_init:int = 0; 
    7         protected static var s_table:Vector.<Number> = new Vector.<Number>(FC_TRI_TABLE_LEN); 
     8        protected static var s_table:Vector.<Vector.<Number>>; 
     9        protected var m_waveNo:int; 
    810 
    911        public function MOscFcTri() { 
    1012            boot(); 
    1113            super(); 
     14            setWaveNo(0); 
    1215        } 
    1316        public static function boot():void { 
    1417            if (s_init) return; 
    15             for(var i:int = 0; i < 16; i++) { 
    16                 s_table[i] = s_table[31 - i] = Number(i) * 2.0 / 15.0 - 1.0; 
     18            s_table = new Vector.<Vector.<Number>>(MAX_WAVE); 
     19                        s_table[0] = new Vector.<Number>(FC_TRI_TABLE_LEN);     // @6-0 
     20                        s_table[1] = new Vector.<Number>(FC_TRI_TABLE_LEN);     // @6-1 
     21                        var i:int; 
     22            for(i = 0; i < 16; i++) { 
     23                s_table[0][i] = s_table[0][31 - i] = Number(i) * 2.0 / 15.0 - 1.0; 
    1724            } 
     25            for(i = 0; i < 32; i++) { 
     26                                s_table[1][i] = (i < 8) ? Number(i)*2.0/14.0 : ((i < 24) ? Number(8-i)*2.0/15.0+1.0: Number(i-24)*2.0/15.0-1.0); 
     27                        } 
    1828            s_init = 1; 
    1929        } 
    2030        public override function getNextSample():Number { 
    21             var val:Number = s_table[m_phase >> (PHASE_SFT+11)]; 
     31            var val:Number = s_table[m_waveNo][m_phase >> (PHASE_SFT+11)]; 
    2232            m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    2333            return val; 
    2434        } 
    2535        public override function getNextSampleOfs(ofs:int):Number { 
    26             var val:Number = s_table[((m_phase + ofs) & PHASE_MSK) >> (PHASE_SFT+11)]; 
     36            var val:Number = s_table[m_waveNo][((m_phase + ofs) & PHASE_MSK) >> (PHASE_SFT+11)]; 
    2737            m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    2838            return val; 
     
    3141            var i:int; 
    3242            for(i = start; i < end; i++) { 
    33                 samples[i] = s_table[m_phase >> (PHASE_SFT+11)]; 
     43                samples[i] = s_table[m_waveNo][m_phase >> (PHASE_SFT+11)]; 
    3444                m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    3545            } 
     
    4151                                        resetPhase(); 
    4252                                } 
    43                 samples[i] = s_table[m_phase >> (PHASE_SFT+11)]; 
     53                samples[i] = s_table[m_waveNo][m_phase >> (PHASE_SFT+11)]; 
    4454                m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    4555                        }                
     
    4858                        var i:int; 
    4959                        for(i = start; i < end; i++) { 
    50                 samples[i] = s_table[m_phase >> (PHASE_SFT+11)]; 
     60                samples[i] = s_table[m_waveNo][m_phase >> (PHASE_SFT+11)]; 
    5161                m_phase += m_freqShift; 
    5262                syncout[i] = (m_phase > PHASE_MSK); 
     
    5464                        }                
    5565        } 
     66        public override function setWaveNo(waveNo:int):void { 
     67            m_waveNo = Math.min(waveNo, MAX_WAVE-1); 
     68        }                        
    5669    } 
    5770} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscGbWave.as

    r34488 r38797  
    3737            } 
    3838        } 
    39         public function setWaveNo(waveNo:int):void { 
     39        public override function setWaveNo(waveNo:int):void { 
    4040            if (waveNo >= MAX_WAVE) waveNo = MAX_WAVE-1; 
    4141            if (!s_table[waveNo]) waveNo = 0; 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscMod.as

    r34488 r38797  
    4444            m_freqShift = frequency * (PHASE_LEN / MSequencer.RATE44100); 
    4545        } 
     46                public function setWaveNo(waveNo:int):void { 
     47                } 
    4648    } 
    4749} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscSaw.as

    r38673 r38797  
    33 
    44    public class MOscSaw extends MOscMod { 
     5        public static const MAX_WAVE:int = 2; 
    56        protected static var s_init:int = 0; 
    6         protected static var s_table:Vector.<Number> = new Vector.<Number>(TABLE_LEN, true); 
     7        protected static var s_table:Vector.<Vector.<Number>>; 
     8        protected var m_waveNo:int; 
    79 
    810        public function MOscSaw() { 
    911            boot(); 
    1012            super(); 
     13            setWaveNo(0); 
    1114        } 
    12  
    1315        public static function boot():void { 
    1416            if (s_init) return; 
     
    1618            var p0:Number; 
    1719            var i:int; 
     20            s_table = new Vector.<Vector.<Number>>(MAX_WAVE); 
     21            for (i = 0; i < MAX_WAVE; i++) { 
     22                s_table[i] = new Vector.<Number>(TABLE_LEN, true); 
     23            }    
    1824            for(i = 0, p0 = 0.0; i < TABLE_LEN; i++) { 
    19                 s_table[i] = p0 * 2.0 - 1.0; 
     25                            s_table[0][i] = p0 * 2.0 - 1.0; 
     26                s_table[1][i] = (p0 < 0.5) ? 2.0 * p0 : 2.0 * p0 - 2.0; 
    2027                p0 += d0; 
    2128            } 
     
    2330        } 
    2431        public override function getNextSample():Number { 
    25             var val:Number = s_table[m_phase >> PHASE_SFT]; 
     32            var val:Number = s_table[m_waveNo][m_phase >> PHASE_SFT]; 
    2633            m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    2734            return val; 
    2835        } 
    2936        public override function getNextSampleOfs(ofs:int):Number { 
    30             var val:Number = s_table[((m_phase + ofs) & PHASE_MSK) >> PHASE_SFT]; 
     37            var val:Number = s_table[m_waveNo][((m_phase + ofs) & PHASE_MSK) >> PHASE_SFT]; 
    3138            m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    3239            return val; 
     
    3542            var i:int; 
    3643            for(i = start; i < end; i++) { 
    37                 samples[i] = s_table[m_phase >> PHASE_SFT]; 
     44                samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 
    3845                m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    3946            } 
     
    4552                                        resetPhase(); 
    4653                                } 
    47                 samples[i] = s_table[m_phase >> PHASE_SFT]; 
     54                samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 
    4855                m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    4956                        }                
     
    5259                        var i:int; 
    5360                        for(i = start; i < end; i++) { 
    54                 samples[i] = s_table[m_phase >> PHASE_SFT]; 
     61                samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 
    5562                m_phase += m_freqShift; 
    5663                syncout[i] = (m_phase > PHASE_MSK); 
     
    5865                        }                
    5966        } 
     67        public override function setWaveNo(waveNo:int):void { 
     68            m_waveNo = Math.min(waveNo, MAX_WAVE-1); 
     69        }                        
    6070    } 
    6171} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscSine.as

    r38672 r38797  
    6969                        }                
    7070        } 
    71         public function setWaveNo(waveNo:int):void { 
     71        public override function setWaveNo(waveNo:int):void { 
    7272            if (waveNo >= MAX_WAVE) waveNo = MAX_WAVE-1; 
    7373            if (!s_table[waveNo]) waveNo = 0; 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscTriangle.as

    r38673 r38797  
    33 
    44    public class MOscTriangle extends MOscMod { 
     5        public static const MAX_WAVE:int = 2; 
    56        protected static var s_init:int = 0; 
    6         protected static var s_table:Vector.<Number> = new Vector.<Number>(TABLE_LEN, true); 
     7        protected static var s_table:Vector.<Vector.<Number>>; 
     8        protected var m_waveNo:int; 
    79 
    810        public function MOscTriangle() { 
    911            boot(); 
    1012            super(); 
     13            setWaveNo(0); 
    1114        } 
    1215        public static function boot():void { 
     
    1518            var p0:Number; 
    1619            var i:int; 
     20            s_table = new Vector.<Vector.<Number>>(MAX_WAVE); 
     21            for (i = 0; i < MAX_WAVE; i++) { 
     22                s_table[i] = new Vector.<Number>(TABLE_LEN, true); 
     23            }                    
    1724            for(i = 0, p0 = 0.0; i < TABLE_LEN; i++) { 
    18                 s_table[i] = (p0 < 0.5) ? (1 - 4 * p0) : (1 - 4 * (1 - p0)); 
     25                s_table[0][i] = (p0 < 0.50) ? (1.0-4.0* p0) : (1.0-4.0*(1.0-p0)); 
     26                s_table[1][i] = (p0 < 0.25) ? (0.0-4.0* p0) : ((p0 < 0.75) ? (-2.0+4.0* p0) : (4.0-4.0* p0)); 
    1927                p0 += d0; 
    2028            } 
     
    2230        } 
    2331        public override function getNextSample():Number { 
    24             var val:Number = s_table[m_phase >> PHASE_SFT]; 
     32            var val:Number = s_table[m_waveNo][m_phase >> PHASE_SFT]; 
    2533            m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    2634            return val; 
    2735        } 
    2836        public override function getNextSampleOfs(ofs:int):Number { 
    29             var val:Number = s_table[((m_phase + ofs) & PHASE_MSK) >> PHASE_SFT]; 
     37            var val:Number = s_table[m_waveNo][((m_phase + ofs) & PHASE_MSK) >> PHASE_SFT]; 
    3038            m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    3139            return val; 
     
    3442            var i:int; 
    3543            for(i = start; i < end; i++) { 
    36                 samples[i] = s_table[m_phase >> PHASE_SFT]; 
     44                samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 
    3745                m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    3846            } 
     
    4452                                        resetPhase(); 
    4553                                } 
    46                 samples[i] = s_table[m_phase >> PHASE_SFT]; 
     54                samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 
    4755                m_phase = (m_phase + m_freqShift) & PHASE_MSK; 
    4856                        }                
     
    5159                        var i:int; 
    5260                        for(i = start; i < end; i++) { 
    53                 samples[i] = s_table[m_phase >> PHASE_SFT]; 
     61                samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 
    5462                m_phase += m_freqShift; 
    5563                syncout[i] = (m_phase > PHASE_MSK); 
     
    5765                        }                
    5866        } 
     67        public override function setWaveNo(waveNo:int):void { 
     68            m_waveNo = Math.min(waveNo, MAX_WAVE-1); 
     69        }                
    5970    } 
    6071} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscWave.as

    r36224 r38797  
    4949            s_length[waveNo] =(PHASE_MSK+1) / s_length[waveNo]; 
    5050        } 
    51         public function setWaveNo(waveNo:int):void { 
     51        public override function setWaveNo(waveNo:int):void { 
    5252            if (waveNo >= MAX_WAVE) waveNo = MAX_WAVE-1; 
    5353            if (!s_table[waveNo]) waveNo = 0; 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MStatus.as

    r38691 r38797  
    3737                public static const MIDIPORTRATE:int  = 34; 
    3838                public static const BASENOTE:int      = 35; 
     39                public static const POLY:int              = 36; 
     40                public static const SOUND_OFF:int         = 37; 
     41                public static const RESET_ALL:int         = 38; 
    3942    } 
    4043} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MTrack.as

    r38691 r38797  
    99        private var m_bpm:Number;         // beat per minute 
    1010        private var m_spt:Number;         // samples per tick 
    11         private var m_ch:MChannel;        // channel (instrument) 
     11        private var m_ch:IChannel;        // channel (instrument) 
    1212        private var m_needle:Number       // delta time 
    1313        private var m_volume:int;         // default volume    (max:127) 
     
    2323        private var m_totalMSec:uint; 
    2424        public  var m_signalInterval:int; 
     25                private var m_polyFound:Boolean; 
     26                private var m_chordBegin:uint; 
     27                private var m_chordEnd:uint; 
     28                private var m_chordMode:Boolean; 
    2529 
    2630        public function MTrack() { 
     
    2832            m_ch                 = new MChannel(); 
    2933            m_needle             = 0.0; 
     34                        m_polyFound                      = false; 
    3035            playTempo(DEFAULT_BPM); 
    3136            m_volume             = 100; 
    32             recGate(15/16); 
     37            recGate(15.0/16.0); 
    3338            recGate2(0); 
    3439            m_events             = new Array(); 
     
    4045            m_lfoWidth = 0.0; 
    4146            m_totalMSec = 0; 
     47                        m_chordBegin = 0; 
     48                        m_chordEnd = 0; 
     49                        m_chordMode = false; 
    4250        } 
    4351 
     
    7381                                break; 
    7482                            case MStatus.NOTE_OFF: 
    75                                 m_ch.noteOff(); 
     83                                m_ch.noteOff(e.getNoteNo()); 
    7684                                break; 
    7785                            case MStatus.NOTE: 
     
    169177                                                                m_ch.setPortBase(e.getPortBase() * 100); 
    170178                                                                break; 
     179                                                        case MStatus.POLY: 
     180                                                                m_ch.setVoiceLimit(e.getVoiceCount()); 
     181                                                                break; 
     182                                                        case MStatus.SOUND_OFF: 
     183                                                                m_ch.setSoundOff(); 
     184                                                                break; 
     185                                                        case MStatus.RESET_ALL: 
     186                                                                m_ch.reset(); 
     187                                                                break;                                                           
    171188                            case MStatus.CLOSE: 
    172189                                m_ch.close(); 
     
    219236            m_delta += delta; 
    220237            m_globalTick += delta; 
    221         } 
     238                        m_chordEnd = Math.max(m_chordEnd, m_globalTick); 
     239        } 
     240                 
     241                public function seekChordStart():void { 
     242            m_globalTick = m_chordBegin; 
     243                } 
    222244 
    223245        public function recDelta(e:MEvent):void { 
     
    227249 
    228250        public function recNote(noteNo:int, len:int, vel:int, keyon:int = 1, keyoff:int = 1):void { 
    229             var e0:MEvent = new MEvent(); 
     251            var e0:MEvent = makeEvent(); 
    230252            if (keyon) { 
    231253                e0.setNoteOn(noteNo, vel); 
     
    234256                e0.setNote(noteNo); 
    235257            } 
    236             recDelta(e0); 
    237             m_events.push(e0); 
    238             var e1:MEvent = new MEvent(); 
     258            pushEvent(e0); 
    239259            if (keyoff) { 
    240260                var gate:int; 
     
    242262                if (gate <= 0) gate = 0; 
    243263                seek(gate); 
    244                 e1.setNoteOff(noteNo, vel); 
    245                 recDelta(e1); 
    246                 m_events.push(e1); 
     264                                recNoteOff(noteNo, vel); 
    247265                seek(len - gate); 
     266                                if (m_chordMode) { 
     267                                        seekChordStart(); 
     268                                } 
    248269            } 
    249270            else { 
     
    251272            } 
    252273        } 
     274                 
     275                public function recNoteOff(noteNo:int, vel:int):void { 
     276                        var e:MEvent = makeEvent(); 
     277                        e.setNoteOff(noteNo, vel); 
     278                        pushEvent(e); 
     279                } 
    253280 
    254281        public function recRest(len:int):void { 
    255282            seek(len); 
    256         } 
     283                        if (m_chordMode) { 
     284                                m_chordBegin += len; 
     285                        } 
     286        } 
     287                 
     288                public function recChordStart():void { 
     289                        if (m_chordMode == false) { 
     290                                m_chordMode = true; 
     291                                m_chordBegin = m_globalTick; 
     292                        } 
     293                } 
     294                 
     295                public function recChordEnd():void { 
     296                        if (m_chordMode) { 
     297                                if (m_events.length > 0) { 
     298                                        m_delta = m_chordEnd - m_events[m_events.length-1].getTick(); 
     299                                } 
     300                                else { 
     301                                        m_delta = 0; 
     302                                } 
     303                                m_globalTick = m_chordEnd; 
     304                                m_chordMode = false; 
     305                        } 
     306                } 
     307                 
    257308        public function recRestMSec(msec:int):void { 
    258309            var len:int = msec * 44100 / (m_spt * 1000); 
     
    261312 
    262313        public function recVolume(vol:int):void { 
    263             var e:MEvent = new MEvent(); 
    264             recDelta(e); 
     314            var e:MEvent = makeEvent(); 
    265315            e.setVolume(vol); 
    266             m_events.push(e); 
     316            pushEvent(e); 
    267317        } 
    268318 
     
    287337            //trace("e(TEMPO"+e.getTempo()+") delta="+(globalTick-preGlobalTick)); 
    288338        } 
     339                 
     340                // 新規イベントインスタンスを得る 
     341                protected function makeEvent():MEvent { 
     342                        var e:MEvent = new MEvent(m_globalTick); 
     343                        e.setDelta(m_delta); 
     344                        m_delta = 0; 
     345                        return e; 
     346                } 
     347                 
     348                // イベントを適切に追加する 
     349                protected function pushEvent(e:MEvent):void { 
     350                        if (m_chordMode == false) { 
     351                                m_events.push(e); 
     352                        } 
     353                        else { 
     354                                insertEvent(e); 
     355                        } 
     356                } 
     357                 
     358                // 挿入先に同時間のイベントがあった場合、その後に挿入する 
     359        protected function insertEvent(e:MEvent):void { 
     360            var n:int = m_events.length; 
     361            var preGlobalTick:uint = 0; 
     362                        var globalTick:uint = e.getTick(); 
     363            var tmpArr:Array = new Array(); 
     364            for(var i:int; i < n; i++) { 
     365                var en:MEvent = m_events[i]; 
     366                var nextTick:uint = preGlobalTick + en.getDelta(); 
     367                if (nextTick > globalTick) { 
     368                    en.setDelta(nextTick - globalTick); 
     369                    e.setDelta(globalTick - preGlobalTick); 
     370                    m_events.splice(i, 0, e); 
     371                    return; 
     372                } 
     373                preGlobalTick = nextTick; 
     374            } 
     375            e.setDelta(globalTick-preGlobalTick); 
     376            m_events.push(e); 
     377        }                
    289378 
    290379        public function recTempo(globalTick:uint, tempo:Number):void { 
    291             var e:MEvent = new MEvent(); 
    292             recDelta(e); 
     380            var e:MEvent = new MEvent(globalTick); // makeEvent()は使用してはならない 
    293381            e.setTempo(tempo); 
    294             recGlobal(globalTick, e); 
     382            insertEvent(e); 
    295383        } 
    296384 
    297385        public function recEOT():void { 
    298             var e:MEvent = new MEvent(); 
    299             recDelta(e); 
     386            var e:MEvent = makeEvent(); 
    300387            e.setEOT(); 
    301             m_events.push(e); 
     388            pushEvent(e); 
    302389        } 
    303390 
     
    312399 
    313400        public function recForm(form:int, sub:int):void { 
    314             var e:MEvent = new MEvent(); 
    315             recDelta(e); 
     401            var e:MEvent = makeEvent(); 
    316402            e.setForm(form, sub); 
    317             m_events.push(e); 
     403            pushEvent(e); 
    318404        } 
    319405 
    320406        public function recEnvelope(env:int, attack:int, times:Vector.<int>, levels:Vector.<int>, release:int):void { 
    321             var e:MEvent = new MEvent(); 
    322             recDelta(e); 
     407            var e:MEvent = makeEvent(); 
    323408            if (env == 1) e.setEnvelope1Atk(attack); else e.setEnvelope2Atk(attack); 
    324             m_events.push(e); 
     409            pushEvent(e); 
    325410            for(var i:int = 0, pts:int = times.length; i < pts; i++){ 
    326                 e = new MEvent(); 
     411                e = makeEvent(); 
    327412                        if (env == 1) e.setEnvelope1Point(times[i], levels[i]); else e.setEnvelope2Point(times[i], levels[i]); 
    328                 m_events.push(e); 
    329             } 
    330             e = new MEvent(); 
     413                pushEvent(e); 
     414            } 
     415            e = makeEvent(); 
    331416            if (env == 1) e.setEnvelope1Rel(release); else e.setEnvelope2Rel(release); 
    332             m_events.push(e); 
     417            pushEvent(e); 
    333418        } 
    334419 
    335420        public function recNoiseFreq(freq:int):void { 
    336             var e:MEvent = new MEvent(); 
    337             recDelta(e); 
     421            var e:MEvent = makeEvent(); 
    338422            e.setNoiseFreq(freq); 
    339             m_events.push(e); 
     423            pushEvent(e); 
    340424        } 
    341425 
    342426        public function recPWM(pwm:int):void { 
    343             var e:MEvent = new MEvent(); 
    344             recDelta(e); 
     427            var e:MEvent = makeEvent(); 
    345428            e.setPWM(pwm); 
    346             m_events.push(e); 
     429            pushEvent(e); 
    347430        } 
    348431 
    349432        public function recPan(pan:int):void { 
    350             var e:MEvent = new MEvent(); 
    351             recDelta(e); 
     433            var e:MEvent = makeEvent(); 
    352434            e.setPan(pan); 
    353             m_events.push(e); 
     435            pushEvent(e); 
    354436        } 
    355437 
    356438        public function recFormant(vowel:int):void { 
    357             var e:MEvent = new MEvent(); 
    358             recDelta(e); 
     439            var e:MEvent = makeEvent(); 
    359440            e.setFormant(vowel); 
    360             m_events.push(e); 
     441            pushEvent(e); 
    361442        } 
    362443 
    363444        public function recDetune(d:int):void { 
    364             var e:MEvent = new MEvent(); 
    365             recDelta(e); 
     445            var e:MEvent = makeEvent(); 
    366446            e.setDetune(d); 
    367             m_events.push(e); 
     447            pushEvent(e); 
    368448        } 
    369449 
    370450        public function recLFO(depth:int, width:int, form:int, subform:int, delay:int, time:int, target:int):void { 
    371             var e:MEvent = new MEvent(); 
    372             recDelta(e); 
     451            var e:MEvent = makeEvent(); 
    373452            e.setLFOFMSF(form, subform); 
    374             m_events.push(e); 
    375             e = new MEvent(); 
     453            pushEvent(e); 
     454            e = makeEvent(); 
    376455            e.setLFODPWD(depth, width); 
    377             m_events.push(e); 
    378             e = new MEvent(); 
     456            pushEvent(e); 
     457            e = makeEvent(); 
    379458            e.setLFODLTM(delay, time); 
    380             m_events.push(e); 
    381             e = new MEvent(); 
     459            pushEvent(e); 
     460            e = makeEvent(); 
    382461            e.setLFOTarget(target); 
    383             m_events.push(e); 
     462            pushEvent(e); 
    384463        } 
    385464 
    386465        public function recLPF(swt:int, amt:int, frq:int, res:int):void { 
    387             var e:MEvent = new MEvent(); 
    388             recDelta(e); 
     466            var e:MEvent = makeEvent(); 
    389467            e.setLPFSWTAMT(swt, amt); 
    390             m_events.push(e); 
    391             e = new MEvent(); 
     468            pushEvent(e); 
     469            e = makeEvent(); 
    392470            e.setLPFFRQRES(frq, res); 
    393             m_events.push(e); 
     471            pushEvent(e); 
    394472        } 
    395473 
    396474        public function recVolMode(m:int): void { 
    397             var e:MEvent = new MEvent(); 
    398             recDelta(e); 
     475            var e:MEvent = makeEvent(); 
    399476            e.setVolMode(m); 
    400             m_events.push(e); 
     477            pushEvent(e); 
    401478        } 
    402479 
    403480        public function recInput(sens:int, pipe:int):void { 
    404             var e:MEvent = new MEvent(); 
    405             recDelta(e); 
     481            var e:MEvent = makeEvent(); 
    406482            e.setInput(sens, pipe); 
    407             m_events.push(e); 
     483            pushEvent(e); 
    408484        } 
    409485 
    410486        public function recOutput(mode:int, pipe:int):void { 
    411             var e:MEvent = new MEvent(); 
    412             recDelta(e); 
     487            var e:MEvent = makeEvent(); 
    413488            e.setOutput(mode, pipe); 
    414             m_events.push(e); 
     489            pushEvent(e); 
    415490        } 
    416491 
    417492        public function recExpression(ex:int):void { 
    418             var e:MEvent = new MEvent(); 
    419             recDelta(e); 
     493            var e:MEvent = makeEvent(); 
    420494            e.setExpression(ex); 
    421             m_events.push(e); 
     495            pushEvent(e); 
    422496        } 
    423497         
    424498        public function recRing(sens:int, pipe:int):void { 
    425                 var e:MEvent = new MEvent(); 
    426                 recDelta(e); 
     499                var e:MEvent = makeEvent(); 
    427500                e.setRing(sens, pipe); 
    428                 m_events.push(e); 
     501                pushEvent(e); 
    429502        } 
    430503         
    431504        public function recSync(mode:int, pipe:int):void { 
    432                 var e:MEvent = new MEvent(); 
    433                 recDelta(e); 
     505                var e:MEvent = makeEvent(); 
    434506                e.setSync(mode, pipe); 
    435                 m_events.push(e); 
     507                pushEvent(e); 
    436508        } 
    437509 
    438510        public function recClose():void { 
    439             var e:MEvent = new MEvent(); 
    440             recDelta(e); 
     511            var e:MEvent = makeEvent(); 
    441512            e.setClose(); 
    442             m_events.push(e); 
     513            pushEvent(e); 
    443514        } 
    444515 
    445516                public function recPortamento(depth:int, len:int):void { 
    446             var e:MEvent = new MEvent(); 
    447             recDelta(e); 
     517            var e:MEvent = makeEvent(); 
    448518            e.setPortamento(depth, len); 
    449             m_events.push(e); 
     519            pushEvent(e); 
    450520                } 
    451521                 
    452522                public function recMidiPort(mode:int):void { 
    453                         var e:MEvent = new MEvent(); 
    454                         recDelta(e); 
     523                        var e:MEvent = makeEvent(); 
    455524                        e.setMidiPort(mode); 
    456                         m_events.push(e); 
     525                        pushEvent(e); 
    457526                } 
    458527                 
    459528                public function recMidiPortRate(rate:int):void { 
    460                         var e:MEvent = new MEvent(); 
    461                         recDelta(e); 
     529                        var e:MEvent = makeEvent(); 
    462530                        e.setMidiPortRate(rate); 
    463                         m_events.push(e); 
     531                        pushEvent(e); 
    464532                } 
    465533 
    466534                public function recPortBase(base:int):void { 
    467                         var e:MEvent = new MEvent(); 
    468                         recDelta(e); 
     535                        var e:MEvent = makeEvent(); 
    469536                        e.setPortBase(base); 
    470                         m_events.push(e); 
     537                        pushEvent(e); 
     538                } 
     539                 
     540                public function recPoly(voiceCount:int):void { 
     541                        var e:MEvent = makeEvent(); 
     542                        e.setPoly(voiceCount); 
     543                        pushEvent(e); 
     544                        m_polyFound = true; 
    471545                } 
    472546 
     
    491565            var i:int, j:int; 
    492566            var e:MEvent; 
    493             for(i; i < ni; i++) { 
     567            for(i = 0; i < ni; i++) { 
    494568                e = m_events[i]; 
    495569                globalTick += e.getDelta(); 
     
    510584                if (maxGlobalTick < trackArr[j].getRecGlobalTick()) maxGlobalTick = trackArr[j].getRecGlobalTick(); 
    511585            } 
    512             e = new MEvent(); 
     586            e = makeEvent(); 
    513587            e.setClose(); 
    514588            recGlobal(maxGlobalTick, e); 
     
    541615            return smin.substr(smin.length-2, 2) + ":" + ssec.substr(ssec.length-2, 2); 
    542616        } 
     617                 
     618        // 発声数取得 
     619        public function getVoiceCount():int { 
     620            return m_ch.getVoiceCount(); 
     621        } 
     622                 
     623        // モノモードへ移行 (再生開始前に行うこと) 
     624        public function usingMono():void { 
     625            m_ch = new MChannel(); 
     626        } 
     627                 
     628        // ポリモードへ移行 (再生開始前に行うこと) 
     629        public function usingPoly(maxVoice:int):void { 
     630            m_ch = new MPolyChannel(maxVoice); 
     631        }                
     632                 
     633                // ポリ命令を1回でも使ったか? 
     634                public function findPoly():Boolean { 
     635                        return m_polyFound; 
     636                } 
    543637    } 
    544638} 
  • lang/actionscript/flmml/trunk/src/flmml.mxml

    r36224 r38797  
    44                xmlns:flmml="com.txt_nifty.sketch.flmml.*" 
    55                layout="absolute" creationComplete="init();"> 
     6        <!--mx:Style> 
     7                TextArea { 
     8                        fontFamily: "MS ゴシック"; 
     9                        fontSize: 10pt; 
     10                } 
     11        </mx:Style--> 
     12 
    613  <mx:Script> 
    714    <![CDATA[ 
     
    1623              player.addEventListener(MMLEvent.COMPLETE,         onComplete); 
    1724              player.addEventListener(MMLEvent.BUFFERING,        onBuffering); 
    18               m_timer = new Timer(1000, 0); 
     25              m_timer = new Timer(250*4, 0); 
    1926              m_timer.addEventListener(TimerEvent.TIMER, onSecond); 
    20             } 
     27           } 
    2128 
    2229            public function setHTML():void { 
     
    7077              m_timer.reset(); 
    7178              progress.text = ""; 
     79                          voiceCount.text = ""; 
    7280            } 
    7381 
     
    7684              m_timer.reset(); 
    7785              progress.text = ""; 
     86                          voiceCount.text = ""; 
    7887            } 
    7988 
    8089            public function onBuffering(e:MMLEvent):void { 
    81               if (e.progress < 100) progress.text = "Buffering " + e.progress + "%"; 
    82               else { 
     90              if (e.progress < 100) { 
     91                                  progress.text = "Buffering " + e.progress + "%"; 
     92                                  voiceCount.text = ""; 
     93              } else { 
    8394                onSecond(e); 
    8495                m_timer.start(); 
     
    8899            public function onSecond(e:Event):void { 
    89100              progress.text = player.getNowTimeStr() + " / " + player.getTotalTimeStr(); 
     101//                        voiceCount.text = "♪" + player.getVoiceCount(); 
    90102            } 
    91103        ]]> 
     
    115127                      change="player.setMasterVolume(hSlider.value);"/> 
    116128          <mx:Label id="progress" text="" /> 
     129          <mx:Label id="voiceCount" text="" /> 
    117130        </mx:Box> 
    118131        <flmml:FlMML id="player" />