Exemplo n.º 1
0
        public void processQueue(WorkerState state, Object arg)
        {
#if DEBUG
            sout.println("SynthesizeWorker#processQueue");
#endif
            PatchWorkQueue q                = (PatchWorkQueue)arg;
            VsqFileEx      vsq              = q.vsq;
            int            channel          = vsq.config.WaveFileOutputChannel == 1 ? 1 : 2;
            double         amp_master       = VocaloSysUtil.getAmplifyCoeffFromFeder(vsq.Mixer.MasterFeder);
            double         pan_left_master  = VocaloSysUtil.getAmplifyCoeffFromPanLeft(vsq.Mixer.MasterPanpot);
            double         pan_right_master = VocaloSysUtil.getAmplifyCoeffFromPanRight(vsq.Mixer.MasterPanpot);
            int            numTrack         = vsq.Track.Count;
            string         tmppath          = AppManager.getTempWaveDir();
            int            track            = q.track;

            VsqTrack vsq_track = vsq.Track[track];
            int      count     = vsq_track.getEventCount();
            if (count <= 0)
            {
                return;// false;
            }
            double amp_track       = VocaloSysUtil.getAmplifyCoeffFromFeder(vsq.Mixer.Slave[track - 1].Feder);
            double pan_left_track  = VocaloSysUtil.getAmplifyCoeffFromPanLeft(vsq.Mixer.Slave[track - 1].Panpot);
            double pan_right_track = VocaloSysUtil.getAmplifyCoeffFromPanRight(vsq.Mixer.Slave[track - 1].Panpot);
            double amp_left        = amp_track * pan_left_track;
            double amp_right       = amp_track * pan_right_track;
            int    total_clocks    = vsq.TotalClocks;
            double total_sec       = vsq.getSecFromClock(total_clocks);

            RendererKind kind = VsqFileEx.getTrackRendererKind(vsq_track);
            mGenerator = VSTiDllManager.getWaveGenerator(kind);
            Amplifier amp = new Amplifier();
            amp.setRoot(mGenerator);
            if (q.renderAll)
            {
                amp.setAmplify(amp_left, amp_right);
            }
            mGenerator.setReceiver(amp);
            mGenerator.setGlobalConfig(AppManager.editorConfig);
            mGenerator.setMainWindow(mMainWindow);

            Mixer mixer = new Mixer();
            mixer.setRoot(mGenerator);
            mixer.setGlobalConfig(AppManager.editorConfig);
            amp.setReceiver(mixer);

            if (q.renderAll && vsq.config.WaveFileOutputFromMasterTrack)
            {
                // トラック全体を合成するモードで,かつ,他トラックを合成して出力するよう指示された場合
                if (numTrack > 2)
                {
                    for (int i = 1; i < numTrack; i++)
                    {
                        if (i == track)
                        {
                            continue;
                        }
                        string file = Path.Combine(tmppath, i + ".wav");
                        if (!File.Exists(file))
                        {
                            // mixするべきファイルが揃っていないのでbailout
                            return;// true;
                        }
                        WaveReader r = null;
                        try {
                            r = new WaveReader(file);
                        } catch (Exception ex) {
                            Logger.write(typeof(SynthesizeWorker) + ".processQueue; ex=" + ex + "\n");
                            r = null;
                        }
                        if (r == null)
                        {
                            return;// true;
                        }
                        double end_sec = vsq.getSecFromClock(q.clockStart);
                        r.setOffsetSeconds(end_sec);
                        Amplifier amp_i_unit = new Amplifier();
                        amp_i_unit.setRoot(mGenerator);
                        double amp_i       = VocaloSysUtil.getAmplifyCoeffFromFeder(vsq.Mixer.Slave[i - 1].Feder);
                        double pan_left_i  = VocaloSysUtil.getAmplifyCoeffFromPanLeft(vsq.Mixer.Slave[i - 1].Panpot);
                        double pan_right_i = VocaloSysUtil.getAmplifyCoeffFromPanRight(vsq.Mixer.Slave[i - 1].Panpot);
                        double amp_left_i  = amp_i * pan_left_i;
                        double amp_right_i = amp_i * pan_right_i;
#if DEBUG
                        sout.println("FormSynthesize#bgWork_DoWork; #" + i + "; amp_left_i=" + amp_left_i + "; amp_right_i=" + amp_right_i);
#endif
                        amp_i_unit.setAmplify(amp_left_i, amp_right_i);
                        FileWaveSender wave_sender = new FileWaveSender(r);
                        wave_sender.setRoot(mGenerator);
                        wave_sender.setGlobalConfig(AppManager.editorConfig);

                        amp_i_unit.setSender(wave_sender);
                        mixer.addSender(amp_i_unit);
                    }
                }
            }

            PortUtil.deleteFile(q.file);
            int sample_rate = vsq.config.SamplingRate;
#if DEBUG
            sout.println("FormSynthesize#bgWork_DoWork; q.file=" + q.file);
#endif
            FileWaveReceiver wave_receiver = new FileWaveReceiver(q.file, channel, 16, sample_rate);
            wave_receiver.setRoot(mGenerator);
            wave_receiver.setGlobalConfig(AppManager.editorConfig);
            Amplifier amp_unit_master = new Amplifier();
            amp_unit_master.setRoot(mGenerator);
            if (q.renderAll)
            {
                double l = amp_master * pan_left_master;
                double r = amp_master * pan_right_master;
                amp_unit_master.setAmplify(l, r);
            }
            mixer.setReceiver(amp_unit_master);
            amp_unit_master.setReceiver(wave_receiver);

            int end = q.clockEnd;
            if (end == int.MaxValue)
            {
                end = vsq.TotalClocks + 240;
            }
            mGenerator.init(vsq, track, q.clockStart, end, sample_rate);

            double sec_start = vsq.getSecFromClock(q.clockStart);
            double sec_end   = vsq.getSecFromClock(end);
            long   samples   = (long)((sec_end - sec_start) * sample_rate);
            mGenerator.begin(samples, state);

            return;// false;
        }
Exemplo n.º 2
0
        public void patchWork(WorkerState state, Object arg)
        {
#if DEBUG
            sout.println("SynthesizeWorker#patchWork");
#endif
            VsqFileEx             vsq    = AppManager.getVsqFile();
            Object[]              args   = (Object[])arg;
            List <PatchWorkQueue> queue  = (List <PatchWorkQueue>)args[0];
            List <int>            tracks = (List <int>)args[1];
            int    finished = queue.Count;
            string temppath = AppManager.getTempWaveDir();
            for (int k = 0; k < tracks.Count; k++)
            {
                int        track      = tracks[k];
                string     wavePath   = Path.Combine(temppath, track + ".wav");
                List <int> queueIndex = new List <int>();

                for (int i = 0; i < queue.Count; i++)
                {
                    if (queue[i].track == track)
                    {
                        queueIndex.Add(i);
                    }
                }

                if (queueIndex.Count <= 0)
                {
                    // 第trackトラックに対してパッチワークを行う必要無し
                    continue;
                }

#if DEBUG
                sout.println("AppManager#pathWorkToFreeze; wavePath=" + wavePath + "; queue.get( queueIndex.get( 0 ) ).file=" + queue[queueIndex[0]].file);
                sout.println("AppManager#pathWorkToFreeze; queueIndex.size()=" + queueIndex.Count);
#endif
                if (queueIndex.Count == 1 && wavePath.Equals(queue[queueIndex[0]].file))
                {
                    // 第trackトラック全体の合成を指示するキューだった場合.
                    // このとき,パッチワークを行う必要なし.
                    AppManager.mLastRenderedStatus[track - 1] =
                        new RenderedStatus((VsqTrack)vsq.Track[track].clone(), vsq.TempoTable, (SequenceConfig)vsq.config.clone());
                    AppManager.serializeRenderingStatus(temppath, track);
                    AppManager.invokeWaveViewReloadRequiredEvent(track, wavePath, 1, -1);
                    continue;
                }

                WaveWriter writer = null;
                try {
                    int  sampleRate  = vsq.config.SamplingRate;
                    long totalLength = (long)((vsq.getSecFromClock(vsq.TotalClocks) + 1.0) * sampleRate);
                    writer = new WaveWriter(wavePath, vsq.config.WaveFileOutputChannel, 16, sampleRate);
                    int      BUFLEN = 1024;
                    double[] bufl   = new double[BUFLEN];
                    double[] bufr   = new double[BUFLEN];
                    double   total  = 0.0;
                    for (int m = 0; m < queueIndex.Count; m++)
                    {
                        int i = queueIndex[m];
                        if (finished <= i)
                        {
                            break;
                        }

                        // パッチワークの開始秒時
                        double secStart    = vsq.getSecFromClock(queue[i].clockStart);
                        long   sampleStart = (long)(secStart * sampleRate);

                        // パッチワークの終了秒時
                        int clockEnd = queue[i].clockEnd;
                        if (clockEnd == int.MaxValue)
                        {
                            clockEnd = vsq.TotalClocks + 240;
                        }
                        double secEnd    = vsq.getSecFromClock(clockEnd);
                        long   sampleEnd = (long)(secEnd * sampleRate);

                        WaveReader wr = null;
                        try {
                            wr = new WaveReader(queue[i].file);
                            long remain2 = sampleEnd - sampleStart;
                            long proc    = 0;
                            while (remain2 > 0)
                            {
                                int delta = remain2 > BUFLEN ? BUFLEN : (int)remain2;
                                wr.read(proc, delta, bufl, bufr);
                                writer.replace(sampleStart + proc, delta, bufl, bufr);
                                proc    += delta;
                                remain2 -= delta;
                                total   += delta;
                                state.reportProgress(total);
                            }
                        } catch (Exception ex) {
                            Logger.write(typeof(AppManager) + ".patchWorkToFreeze; ex=" + ex + "\n");
                            serr.println("AppManager#patchWorkToFreeze; ex=" + ex);
                        } finally {
                            if (wr != null)
                            {
                                try {
                                    wr.close();
                                } catch (Exception ex2) {
                                    Logger.write(typeof(AppManager) + ".patchWorkToFreeze; ex=" + ex2 + "\n");
                                    serr.println("AppManager#patchWorkToFreeze; ex2=" + ex2);
                                }
                            }
                        }

                        try {
                            PortUtil.deleteFile(queue[i].file);
                        } catch (Exception ex) {
                            Logger.write(typeof(AppManager) + ".patchWorkToFreeze; ex=" + ex + "\n");
                            serr.println("AppManager#patchWorkToFreeze; ex=" + ex);
                        }
                    }

                    VsqTrack vsq_track = vsq.Track[track];
                    if (queueIndex[queueIndex.Count - 1] <= finished)
                    {
                        // 途中で終了せず,このトラックの全てのパッチワークが完了した.
                        AppManager.mLastRenderedStatus[track - 1] =
                            new RenderedStatus((VsqTrack)vsq_track.clone(), vsq.TempoTable, (SequenceConfig)vsq.config.clone());
                        AppManager.serializeRenderingStatus(temppath, track);
                        AppManager.setRenderRequired(track, false);
                    }
                    else
                    {
                        // パッチワークの作成途中で,キャンセルされた
                        // キャンセルされたやつ以降の範囲に、プログラムチェンジ17の歌手変更イベントを挿入する。→AppManager#detectTrackDifferenceに必ず検出してもらえる。
                        VsqTrack copied = (VsqTrack)vsq_track.clone();
                        VsqEvent dumy   = new VsqEvent();
                        dumy.ID.type               = VsqIDType.Singer;
                        dumy.ID.IconHandle         = new IconHandle();
                        dumy.ID.IconHandle.Program = 17;
                        for (int m = 0; m < queueIndex.Count; m++)
                        {
                            int i = queueIndex[m];
                            if (i < finished)
                            {
                                continue;
                            }
                            int      start       = queue[i].clockStart;
                            int      end         = queue[i].clockEnd;
                            VsqEvent singerAtEnd = vsq_track.getSingerEventAt(end);

                            // startの位置に歌手変更が既に指定されていないかどうかを検査
                            int foundStart = -1;
                            int foundEnd   = -1;
                            for (Iterator <int> itr = copied.indexIterator(IndexIteratorKind.SINGER); itr.hasNext();)
                            {
                                int      j  = itr.next();
                                VsqEvent ve = copied.getEvent(j);
                                if (ve.Clock == start)
                                {
                                    foundStart = j;
                                }
                                if (ve.Clock == end)
                                {
                                    foundEnd = j;
                                }
                                if (end < ve.Clock)
                                {
                                    break;
                                }
                            }

                            VsqEvent dumyStart = (VsqEvent)dumy.clone();
                            dumyStart.Clock = start;
                            if (foundStart >= 0)
                            {
                                copied.setEvent(foundStart, dumyStart);
                            }
                            else
                            {
                                copied.addEvent(dumyStart);
                            }

                            if (end != int.MaxValue)
                            {
                                VsqEvent dumyEnd = (VsqEvent)singerAtEnd.clone();
                                dumyEnd.Clock = end;
                                if (foundEnd >= 0)
                                {
                                    copied.setEvent(foundEnd, dumyEnd);
                                }
                                else
                                {
                                    copied.addEvent(dumyEnd);
                                }
                            }

                            copied.sortEvent();
                        }

                        AppManager.mLastRenderedStatus[track - 1] = new RenderedStatus(copied, vsq.TempoTable, (SequenceConfig)vsq.config.clone());
                        AppManager.serializeRenderingStatus(temppath, track);
                    }

                    state.reportComplete();
                } catch (Exception ex) {
                    Logger.write(typeof(AppManager) + ".patchWorkToFreeze; ex=" + ex + "\n");
                    serr.println("AppManager#patchWorkToFreeze; ex=" + ex);
                } finally {
                    if (writer != null)
                    {
                        try {
                            writer.close();
                        } catch (Exception ex2) {
                            Logger.write(typeof(AppManager) + ".patchWorkToFreeze; ex=" + ex2 + "\n");
                            serr.println("AppManager#patchWorkToFreeze; ex2=" + ex2);
                        }
                    }
                }

                // 波形表示用のWaveDrawContextの内容を更新する。

                /*for ( int j = 0; j < queueIndex.size(); j++ ) {
                 *  int i = queueIndex.get( j );
                 *  if ( i >= finished ) {
                 *      continue;
                 *  }
                 *  double secStart = mVsq.getSecFromClock( queue.get( i ).clockStart );
                 *  int clockEnd = queue.get( i ).clockEnd;
                 *  if ( clockEnd == int.MaxValue ) {
                 *      clockEnd = mVsq.TotalClocks + 240;
                 *  }
                 *  double secEnd = mVsq.getSecFromClock( clockEnd );
                 *
                 *  invokeWaveViewReloadRequiredEvent( tracks.get( k ), wavePath, secStart, secEnd );
                 * }*/
                AppManager.invokeWaveViewReloadRequiredEvent(track, wavePath, 1, -1);
            }
#if DEBUG
            sout.println("SynthesizeWorker#patchWork; done");
#endif
            state.reportComplete();
        }
Exemplo n.º 3
0
        public static void Main(string[] args)
        {
            Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
            Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(Cadencii_UnhandledException);

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            // 引数を解釈
            parseArguments(args);
            if (mPrintVersion)
            {
                Console.Write(BAssemblyInfo.fileVersion);
                return;
            }
            string file = mPathVsq;

            Logger.setEnabled(false);
            string logfile = PortUtil.createTempFile() + ".txt";

            Logger.setPath(logfile);
#if DEBUG
            Logger.setEnabled(true);
#endif

#if !DEBUG
            try {
#endif

            // 言語設定を読み込み
            try {
                Messaging.loadMessages();
                // システムのデフォルトの言語を調べる.
                // EditorConfigのコンストラクタは,この判定を自動でやるのでそれを利用
                EditorConfig ec = new EditorConfig();
                Messaging.setLanguage(ec.Language);
            } catch (Exception ex) {
                Logger.write(typeof(FormMain) + ".ctor; ex=" + ex + "\n");
                serr.println("FormMain#.ctor; ex=" + ex);
            }

            // 開発版の場合の警告ダイアログ
            string str_minor = BAssemblyInfo.fileVersionMinor;
            int minor        = 0;
            try {
                minor = int.Parse(str_minor);
            } catch (Exception ex) {
            }

            /*if ((minor % 2) != 0) {
             *  AppManager.showMessageBox(
             *      PortUtil.formatMessage(
             *          _("Info: This is test version of Cadencii version {0}"),
             *          BAssemblyInfo.fileVersionMeasure + "." + (minor + 1)),
             *      "Cadencii_UTAU",
             *      cadencii.windows.forms.Utility.MSGBOX_DEFAULT_OPTION,
             *      cadencii.windows.forms.Utility.MSGBOX_INFORMATION_MESSAGE);
             * }*/

            // スプラッシュを表示するスレッドを開始
#if !MONO
            splashThread = new Thread(new ThreadStart(showSplash));
            splashThread.TrySetApartmentState(ApartmentState.STA);
            splashThread.Start();
#endif

            // AppManagerの初期化
            AppManager.init();

#if ENABLE_SCRIPT
            try {
                ScriptServer.reload();
                PaletteToolServer.init();
            } catch (Exception ex) {
                serr.println("Cadencii::Main; ex=" + ex);
                Logger.write(typeof(Cadencii) + ".Main; ex=" + ex + "\n");
            }
#endif
            AppManager.mMainWindowController = new FormMainController();
            AppManager.mMainWindow           = new FormMain(AppManager.mMainWindowController, file);
#if !MONO
            AppManager.mMainWindow.Load += mainWindow_Load;
#endif
            Application.Run(AppManager.mMainWindow);
#if !DEBUG
        }

        catch (Exception ex) {
            String            str_ex = getExceptionText(ex, 0);
            FormCompileResult dialog = new FormCompileResult(
                _("Failed to launch Cadencii. Please send the exception report to developer"),
                str_ex);
            dialog.Text = _("Error");
            dialog.ShowDialog();
            if (splash != null)
            {
                splash.Invoke(new Action(splash.Close));
            }
            Logger.write(typeof(Cadencii) + ".Main; ex=" + ex + "\n");
        }
#endif
        }
Exemplo n.º 4
0
        /// <summary>
        /// スクリプトを実行します。
        /// </summary>
        /// <param name="evsd"></param>
        public static bool invokeScript(string id, VsqFileEx vsq)
        {
            ScriptInvoker script_invoker = null;

            if (scripts.ContainsKey(id))
            {
                script_invoker = scripts[id];
            }
            else
            {
                return(false);
            }
            if (script_invoker != null && script_invoker.scriptDelegate != null)
            {
                try {
                    VsqFileEx          work = (VsqFileEx)vsq.clone();
                    ScriptReturnStatus ret  = ScriptReturnStatus.ERROR;
                    if (script_invoker.scriptDelegate is EditVsqScriptDelegate)
                    {
                        bool b_ret = ((EditVsqScriptDelegate)script_invoker.scriptDelegate).Invoke(work);
                        if (b_ret)
                        {
                            ret = ScriptReturnStatus.EDITED;
                        }
                        else
                        {
                            ret = ScriptReturnStatus.ERROR;
                        }
                    }
                    else if (script_invoker.scriptDelegate is EditVsqScriptDelegateEx)
                    {
                        bool b_ret = ((EditVsqScriptDelegateEx)script_invoker.scriptDelegate).Invoke(work);
                        if (b_ret)
                        {
                            ret = ScriptReturnStatus.EDITED;
                        }
                        else
                        {
                            ret = ScriptReturnStatus.ERROR;
                        }
                    }
                    else if (script_invoker.scriptDelegate is EditVsqScriptDelegateWithStatus)
                    {
                        ret = ((EditVsqScriptDelegateWithStatus)script_invoker.scriptDelegate).Invoke(work);
                    }
                    else if (script_invoker.scriptDelegate is EditVsqScriptDelegateExWithStatus)
                    {
                        ret = ((EditVsqScriptDelegateExWithStatus)script_invoker.scriptDelegate).Invoke(work);
                    }
                    else
                    {
                        ret = ScriptReturnStatus.ERROR;
                    }
                    if (ret == ScriptReturnStatus.ERROR)
                    {
                        AppManager.showMessageBox(_("Script aborted"), "Cadencii_UTAU", cadencii.windows.forms.Utility.MSGBOX_DEFAULT_OPTION, cadencii.windows.forms.Utility.MSGBOX_INFORMATION_MESSAGE);
                    }
                    else if (ret == ScriptReturnStatus.EDITED)
                    {
                        CadenciiCommand run = VsqFileEx.generateCommandReplace(work);
                        AppManager.editHistory.register(vsq.executeCommand(run));
                    }
                    string     config_file          = configFileNameFromScriptFileName(script_invoker.ScriptFile);
                    FileStream fs                   = null;
                    bool       delete_xml_when_exit = false; // xmlを消すときtrue
                    try {
                        fs = new FileStream(config_file, FileMode.Create, FileAccess.Write);
                        script_invoker.Serializer.serialize(fs, null);
                    } catch (Exception ex) {
                        serr.println("AppManager#invokeScript; ex=" + ex);
                        delete_xml_when_exit = true;
                    } finally {
                        if (fs != null)
                        {
                            try {
                                fs.Close();
                                if (delete_xml_when_exit)
                                {
                                    PortUtil.deleteFile(config_file);
                                }
                            } catch (Exception ex2) {
                                serr.println("AppManager#invokeScript; ex2=" + ex2);
                            }
                        }
                    }
                    return(ret == ScriptReturnStatus.EDITED);
                } catch (Exception ex) {
                    AppManager.showMessageBox(_("Script runtime error:") + " " + ex, _("Error"), cadencii.windows.forms.Utility.MSGBOX_DEFAULT_OPTION, cadencii.windows.forms.Utility.MSGBOX_INFORMATION_MESSAGE);
                    serr.println("AppManager#invokeScript; ex=" + ex);
                }
            }
            else
            {
                AppManager.showMessageBox(_("Script compilation failed."), _("Error"), cadencii.windows.forms.Utility.MSGBOX_DEFAULT_OPTION, cadencii.windows.forms.Utility.MSGBOX_WARNING_MESSAGE);
            }
            return(false);
        }
        public void timer_Tick(Object sender, EventArgs e)
        {
            //int num_btn = vstidrv.JoyGetNumButtons( 0 );
            byte[] btn;
            int    pov;

            winmmhelp.JoyGetStatus(0, out btn, out pov);

#if DEBUG
            AppManager.debugWriteLine("FormGameControlerConfig+timer_Tick");
            AppManager.debugWriteLine("    pov=" + pov);
#endif
            bool added = false;
            if (index <= 4)
            {
                if (pov >= 0 && !m_povs.Contains(pov))
                {
                    m_povs[index - 1] = pov;
                    added             = true;
                }
            }
            else
            {
                for (int i = 0; i < btn.Length; i++)
                {
                    if (btn[i] > 0x0 && !m_list.Contains(i))
                    {
                        m_list[index - 5] = i;
                        added             = true;
                        break;
                    }
                }
            }
            if (added)
            {
                if (index <= 8)
                {
                    progressCount.Value = index;
                }
                else if (index <= 12)
                {
                    progressCount.Value = index - 8;
                }
                else
                {
                    progressCount.Value = index - 12;
                }

                if (index == 8)
                {
                    pictButton.Image      = Properties.Resources.btn2;
                    progressCount.Value   = 0;
                    progressCount.Maximum = 4;
                }
                else if (index == 12)
                {
                    pictButton.Image      = Properties.Resources.btn3;
                    progressCount.Value   = 0;
                    progressCount.Maximum = 2;
                }
                if (index == 14)
                {
                    btnSkip.Enabled = false;
                    btnOK.Enabled   = true;
                    timer.Stop();
                }
                index++;
            }
        }
Exemplo n.º 6
0
        /// <summary>
        /// 現在のシーケンスの状態に応じて,ミキサーウィンドウの状態を更新します
        /// </summary>
        public void updateStatus()
        {
            VsqFileEx vsq = AppManager.getVsqFile();
            int       num = vsq.Mixer.Slave.Count + AppManager.getBgmCount();

            if (m_tracker == null)
            {
                m_tracker = new List <VolumeTracker>();
            }

            // イベントハンドラをいったん解除する
            unregisterEventHandlers();

            // trackerの総数が変化したかどうか
            bool num_changed = (m_tracker.Count != num);

            // trackerに過不足があれば数を調節
            if (m_tracker.Count < num)
            {
                int remain = num - m_tracker.Count;
                for (int i = 0; i < remain; i++)
                {
                    VolumeTracker item = new VolumeTracker();
                    item.BorderStyle = BorderStyle.FixedSingle;
                    item.Size        = volumeMaster.Size;
                    m_tracker.Add(item);
                }
            }
            else if (m_tracker.Count > num)
            {
                int delete = m_tracker.Count - num;
                for (int i = 0; i < delete; i++)
                {
                    int           indx = m_tracker.Count - 1;
                    VolumeTracker tr   = m_tracker[indx];
                    m_tracker.RemoveAt(indx);
                    tr.Dispose();
                }
            }

            // 同時に表示できるVolumeTrackerの個数を計算
            int max              = PortUtil.getWorkingArea(this).width;
            int bordersize       = 4;// TODO: ここもともとは SystemInformation.FrameBorderSize;だった
            int max_client_width = max - 2 * bordersize;
            int max_num          = (int)Math.Floor(max_client_width / (VolumeTracker.WIDTH + 1.0f));

            num++;

            int screen_num = num <= max_num ? num : max_num; //スクリーン上に表示するVolumeTrackerの個数

            // panelSlaves上に配置するVolumeTrackerの個数
            int num_vtracker_on_panel = vsq.Mixer.Slave.Count + AppManager.getBgmCount();
            // panelSlaves上に一度に表示可能なVolumeTrackerの個数
            int panel_capacity = max_num - 1;

            if (panel_capacity >= num_vtracker_on_panel)
            {
                // volumeMaster以外の全てのVolumeTrackerを,画面上に同時表示可能
                hScroll.Minimum     = 0;
                hScroll.Value       = 0;
                hScroll.Maximum     = 0;
                hScroll.LargeChange = 1;
                hScroll.Size        = new Size((VolumeTracker.WIDTH + 1) * num_vtracker_on_panel, 15);
            }
            else
            {
                // num_vtracker_on_panel個のVolumeTrackerのうち,panel_capacity個しか,画面上に同時表示できない
                hScroll.Minimum     = 0;
                hScroll.Value       = 0;
                hScroll.Maximum     = num_vtracker_on_panel * VolumeTracker.WIDTH;
                hScroll.LargeChange = panel_capacity * VolumeTracker.WIDTH;
                hScroll.Size        = new Size((VolumeTracker.WIDTH + 1) * panel_capacity, 15);
            }
            hScroll.Location = new System.Drawing.Point(0, VolumeTracker.HEIGHT);

            int j = -1;

            foreach (var vme in vsq.Mixer.Slave)
            {
                j++;
#if DEBUG
                sout.println("FormMixer#updateStatus; #" + j + "; feder=" + vme.Feder + "; panpot=" + vme.Panpot);
#endif
                VolumeTracker tracker = m_tracker[j];
                tracker.setFeder(vme.Feder);
                tracker.setPanpot(vme.Panpot);
                tracker.setTitle(vsq.Track[j + 1].getName());
                tracker.setNumber((j + 1) + "");
                tracker.setLocation(j * (VolumeTracker.WIDTH + 1), 0);
                tracker.setSoloButtonVisible(true);
                tracker.setMuted((vme.Mute == 1));
                tracker.setSolo((vme.Solo == 1));
                tracker.setTrack(j + 1);
                tracker.setSoloButtonVisible(true);
                addToPanelSlaves(tracker, j);
            }
            int count = AppManager.getBgmCount();
            for (int i = 0; i < count; i++)
            {
                j++;
                BgmFile       item    = AppManager.getBgm(i);
                VolumeTracker tracker = m_tracker[j];
                tracker.setFeder(item.feder);
                tracker.setPanpot(item.panpot);
                tracker.setTitle(PortUtil.getFileName(item.file));
                tracker.setNumber("");
                tracker.setLocation(j * (VolumeTracker.WIDTH + 1), 0);
                tracker.setSoloButtonVisible(false);
                tracker.setMuted((item.mute == 1));
                tracker.setSolo(false);
                tracker.setTrack(-i - 1);
                tracker.setSoloButtonVisible(false);
                addToPanelSlaves(tracker, j);
            }
#if DEBUG
            sout.println("FormMixer#updateStatus; vsq.Mixer.MasterFeder=" + vsq.Mixer.MasterFeder);
#endif
            volumeMaster.setFeder(vsq.Mixer.MasterFeder);
            volumeMaster.setPanpot(vsq.Mixer.MasterPanpot);
            volumeMaster.setSoloButtonVisible(false);

            updateSoloMute();

            // イベントハンドラを再登録
            reregisterEventHandlers();

            // ウィンドウのサイズを更新(必要なら)
            if (num_changed)
            {
                panelSlaves.Width     = (VolumeTracker.WIDTH + 1) * (screen_num - 1);
                volumeMaster.Location = new System.Drawing.Point((screen_num - 1) * (VolumeTracker.WIDTH + 1) + 3, 0);
                this.MaximumSize      = Size.Empty;
                this.MinimumSize      = Size.Empty;
                this.ClientSize       = new Size(screen_num * (VolumeTracker.WIDTH + 1) + 3, VolumeTracker.HEIGHT + hScroll.Height);
                this.MinimumSize      = this.Size;
                this.MaximumSize      = this.Size;
                this.Invalidate();
                //m_parent.requestFocusInWindow(); // <-要る?
            }
        }
Exemplo n.º 7
0
        /// <summary>
        /// numStartBar, numStartBeat, numEndBar, numEndBeatの値の範囲の妥当性をチェックする
        /// </summary>
        private void validateNumRange()
        {
            int       startBar  = getStartBar();
            int       startBeat = getStartBeat();
            int       endBar    = getEndBar();
            int       endBeat   = getEndBeat();
            VsqFileEx vsq       = AppManager.getVsqFile();

            if (vsq == null)
            {
                return;
            }

            int preMeasure = vsq.getPreMeasure();

            startBar += (preMeasure - 1); // 曲頭からの小節数は、表示上の小節数と(preMeasure - 1)だけずれているので。
            endBar   += (preMeasure - 1);
            startBeat--;
            endBeat--;

            int     startBarClock = vsq.getClockFromBarCount(startBar);                             // startBar小節開始位置のゲートタイム
            Timesig startTimesig  = vsq.getTimesigAt(startBarClock);                                // startBar小節開始位置の拍子
            int     startClock    = startBarClock + startBeat * 480 * 4 / startTimesig.denominator; // 第startBar小節の第startBeat拍開始位置のゲートタイム

            int     endBarClock = vsq.getClockFromBarCount(endBar);
            Timesig endTimesig  = vsq.getTimesigAt(endBarClock);
            int     endClock    = endBarClock + endBeat * 480 * 4 / endTimesig.denominator;

            if (endClock <= startClock)
            {
                // 選択範囲が0以下の場合、値を強制的に変更する
                // ここでは、一拍分を選択するように変更
                endClock = startClock + 480 * 4 / startTimesig.denominator;
                endBar   = vsq.getBarCountFromClock(endClock);
                int remain = endClock - vsq.getClockFromBarCount(endBar);
                endTimesig = vsq.getTimesigAt(endClock);
                endBeat    = remain / (480 * 4 / endTimesig.denominator);
            }

            // numStartBarの最大値・最小値を決定
            int startBarMax = endBar - 1;

            if (startBeat < endBeat)
            {
                startBarMax = endBar;
            }
            int startBarMin = 1;

            // numStartBeatの最大値・最小値を決定
            int startBeatMax = startTimesig.numerator;

            if (startBar == endBar)
            {
                startBeatMax = endBeat - 1;
            }
            int startBeatMin = 1;

            // numEndBarの最大値・最小値を決定
            int endBarMax = int.MaxValue;
            int endBarMin = startBar + 1;

            if (startBeat < endBeat)
            {
                endBarMin = startBar;
            }

            // numEndBeatの最大値・最小値の決定
            int endBeatMax = endTimesig.numerator;
            int endBeatMin = 1;

            if (startBar == endBar)
            {
                endBeatMin = startBeat + 1;
            }

            lockRequired         = true;
            numStartBar.Maximum  = startBarMax;
            numStartBar.Minimum  = startBarMin;
            numStartBeat.Maximum = startBeatMax;
            numStartBeat.Minimum = startBeatMin;
            numEndBar.Maximum    = endBarMax;
            numEndBar.Minimum    = endBarMin;
            numEndBeat.Maximum   = endBeatMax;
            numEndBeat.Minimum   = endBeatMin;
            lockRequired         = false;
        }
Exemplo n.º 8
0
        /// <summary>
        /// コンポーネントの描画関数です
        /// </summary>
        /// <param name="g"></param>
        public void paint(Graphics g1)
        {
            int       width  = Width;
            int       height = Height;
            Rectangle rc     = new Rectangle(0, 0, width, height);

            Graphics2D g = (Graphics2D)g1;

            // 背景を塗りつぶす
            g.setStroke(getStrokeDefault());
            g.setColor(Color.gray);
            g.fillRect(rc.x, rc.y, rc.width, rc.height);

            if (AppManager.skipDrawingWaveformWhenPlaying && AppManager.isPlaying())
            {
                // 左側のボタン部との境界線
                g.setColor(mBorderColor);
                g.drawLine(0, 0, 0, height);

                g.setColor(Color.black);
                PortUtil.drawStringEx(
                    g,
                    "(hidden for performance)",
                    AppManager.baseFont8,
                    rc,
                    PortUtil.STRING_ALIGN_CENTER,
                    PortUtil.STRING_ALIGN_CENTER);
                return;
            }

            // スケール線を描く
            int half_height = height / 2;

            g.setColor(Color.black);
            g.drawLine(0, half_height, width, half_height);

            // 描画コンテキストを用いて波形を描画
            int             selected = AppManager.getSelected();
            WaveDrawContext context  = mDrawer[selected - 1];

            if (context != null)
            {
                if (mAutoMaximize)
                {
                    context.draw(
                        g,
                        Color.black,
                        rc,
                        AppManager.clockFromXCoord(AppManager.keyWidth),
                        AppManager.clockFromXCoord(AppManager.keyWidth + width),
                        AppManager.getVsqFile().TempoTable,
                        AppManager.mMainWindowController.getScaleX());
                }
                else
                {
                    context.draw(
                        g,
                        Color.black,
                        rc,
                        AppManager.clockFromXCoord(AppManager.keyWidth),
                        AppManager.clockFromXCoord(AppManager.keyWidth + width),
                        AppManager.getVsqFile().TempoTable,
                        AppManager.mMainWindowController.getScaleX(),
                        mScale);
                }
            }

            // 左側のボタン部との境界線
            g.setColor(mBorderColor);
            g.drawLine(0, 0, 0, height);

            // ソングポジション
            int song_pos_x = AppManager.xCoordFromClocks(AppManager.getCurrentClock()) - AppManager.keyWidth;

            if (0 < song_pos_x)
            {
                g.setColor(Color.white);
                g.setStroke(getStroke2px());
                g.drawLine(song_pos_x, 0, song_pos_x, height);
            }
        }
        private void applyValue(bool mode_clock)
        {
            if (!m_changed)
            {
                return;
            }
            int value = m_curve.getDefault();

            try {
                value = int.Parse(txtDataPointValue.Text);
            } catch (Exception ex) {
                Logger.write(typeof(FormCurvePointEdit) + ".applyValue; ex=" + ex + "\n");
                return;
            }
            if (value < m_curve.getMinimum())
            {
                value = m_curve.getMinimum();
            }
            else if (m_curve.getMaximum() < value)
            {
                value = m_curve.getMaximum();
            }

            int clock = 0;

            try {
                clock = int.Parse(txtDataPointClock.Text);
            } catch (Exception ex) {
                Logger.write(typeof(FormCurvePointEdit) + ".applyValue; ex=" + ex + "\n");
                return;
            }

            int       selected  = AppManager.getSelected();
            VsqTrack  vsq_track = AppManager.getVsqFile().Track[selected];
            VsqBPList src       = vsq_track.getCurve(m_curve.getName());
            VsqBPList list      = (VsqBPList)src.clone();

            VsqBPPairSearchContext context = list.findElement(m_editing_id);

            list.move(context.clock, clock, value);
            CadenciiCommand run = new CadenciiCommand(VsqCommand.generateCommandTrackCurveReplace(selected,
                                                                                                  m_curve.getName(),
                                                                                                  list));
            EditedZone zone = new EditedZone();

            Utility.compareList(zone, new VsqBPListComparisonContext(list, src));
            List <EditedZoneUnit> zoneUnits = new List <EditedZoneUnit>();

            foreach (var item in zone.iterator())
            {
                zoneUnits.Add(item);
            }
            AppManager.editHistory.register(AppManager.getVsqFile().executeCommand(run));

            txtDataPointClock.Text = clock + "";
            txtDataPointValue.Text = value + "";

            if (mMainWindow != null)
            {
                mMainWindow.setEdited(true);
                mMainWindow.ensureVisible(clock);
                mMainWindow.refreshScreen();
            }

            if (mode_clock)
            {
                txtDataPointClock.SelectAll();
            }
            else
            {
                txtDataPointValue.SelectAll();
            }

            btnUndo.Enabled = AppManager.editHistory.hasUndoHistory();
            btnRedo.Enabled = AppManager.editHistory.hasRedoHistory();
            m_changed       = false;
        }
Exemplo n.º 10
0
        public void commonButton_Click(Object sender, EventArgs e)
        {
            VsqBPList list = AppManager.getVsqFile().Track[AppManager.getSelected()].getCurve(m_curve.getName());
            VsqBPPairSearchContext search = list.findElement(m_editing_id);
            int index = search.index;

            if (sender == btnForward)
            {
                index++;
            }
            else if (sender == btnBackward)
            {
                index--;
            }
            else if (sender == btnBackward2)
            {
                index -= 5;
            }
            else if (sender == btnForward2)
            {
                index += 5;
            }
            else if (sender == btnForward3)
            {
                index += 10;
            }
            else if (sender == btnBackward3)
            {
                index -= 10;
            }

            if (index < 0)
            {
                index = 0;
            }

            if (list.size() <= index)
            {
                index = list.size() - 1;
            }

            VsqBPPair bp = list.getElementB(index);

            m_editing_id = bp.id;
            int clock = list.getKeyClock(index);

            txtDataPointClock.TextChanged -= commonTextBox_TextChanged;
            txtDataPointValue.TextChanged -= commonTextBox_TextChanged;
            txtDataPointClock.Text         = clock + "";
            txtDataPointValue.Text         = bp.value + "";
            txtDataPointClock.TextChanged += commonTextBox_TextChanged;
            txtDataPointValue.TextChanged += commonTextBox_TextChanged;

            txtDataPointValue.Focus();
            txtDataPointValue.SelectAll();

            AppManager.itemSelection.clearPoint();
            AppManager.itemSelection.addPoint(m_curve, bp.id);
            if (mMainWindow != null)
            {
                mMainWindow.ensureVisible(clock);
                mMainWindow.refreshScreen();
            }
        }
Exemplo n.º 11
0
        /// <summary>
        /// パレットツールを読み込みます
        /// </summary>
        public static void init()
        {
            string path = Utility.getToolPath();

            if (!Directory.Exists(path))
            {
                return;
            }

            FileInfo[] files = new DirectoryInfo(path).GetFiles("*.txt");
            foreach (FileInfo file in files)
            {
                string       code = "";
                StreamReader sr   = null;
                try {
                    sr    = new StreamReader(file.FullName);
                    code += sr.ReadToEnd();
                } catch (Exception ex) {
                    Logger.write(typeof(PaletteToolServer) + ".init; ex=" + ex + "\n");
                } finally {
                    if (sr != null)
                    {
                        try {
                            sr.Close();
                        } catch (Exception ex2) {
                            Logger.write(typeof(PaletteToolServer) + ".init; ex=" + ex2 + "\n");
                        }
                    }
                }

                Assembly      asm    = null;
                List <string> errors = new List <string>();
                try {
                    asm = (new PluginLoader()).compileScript(code, errors);
                } catch (Exception ex) {
                    serr.println("PaletteToolServer#init; ex=" + ex);
                    asm = null;
                }
                if (asm == null)
                {
                    continue;
                }

                if (asm == null)
                {
                    continue;
                }

                foreach (Type t in asm.GetTypes())
                {
                    if (t.IsClass && t.IsPublic && !t.IsAbstract && t.GetInterface(typeof(IPaletteTool).FullName) != null)
                    {
                        try {
#if DEBUG
                            AppManager.debugWriteLine("t.FullName=" + t.FullName);
#endif
                            Object instance = asm.CreateInstance(t.FullName);
                            string dir      = Path.Combine(Utility.getApplicationDataPath(), "tool");
                            string cfg      = Path.GetFileNameWithoutExtension(file.FullName) + ".config";
                            string config   = Path.Combine(dir, cfg);
                            if (File.Exists(config))
                            {
                                XmlStaticMemberSerializer xsms = new XmlStaticMemberSerializer(instance.GetType());
                                FileStream fs = null;
                                bool       errorOnDeserialize = false;
                                try {
                                    fs = new FileStream(config, FileMode.Open, FileAccess.Read);
                                    try {
                                        xsms.Deserialize(fs);
                                    } catch (Exception ex) {
                                        errorOnDeserialize = true;
                                        serr.println("PaletteToolServer#init; ex=" + ex);
                                    }
                                } catch (Exception ex) {
                                    serr.println("PaletteToolServer#init; ex=" + ex);
                                } finally {
                                    if (fs != null)
                                    {
                                        try {
                                            fs.Close();
                                        } catch (Exception ex2) {
                                            serr.println("PaletteToolServer#init; ex2=" + ex2);
                                        }
                                    }
                                }
                                if (errorOnDeserialize)
                                {
                                    try {
                                        PortUtil.deleteFile(config);
                                    } catch (Exception ex) {
                                        serr.println("PaletteToolServer#init; ex=" + ex);
                                    }
                                }
                            }
                            string id = Path.GetFileNameWithoutExtension(file.FullName);
                            loadedTools[id] = instance;
                        } catch (Exception ex) {
                            serr.println("PlaetteToolServer#init; ex=" + ex);
                        }
                    }
                }
            }
        }