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; }
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(); }
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 }
/// <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++; } }
/// <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(); // <-要る? } }
/// <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; }
/// <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; }
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(); } }
/// <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); } } } } }