//--------------------------------------------------------------
//	いろいろなメソッド
//
//		作成者：三上直樹，2022/03/12 作成，©三上直樹 2022
//--------------------------------------------------------------

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Numerics;

using Mikami.Application;
using static System.Math;

namespace グラフィックイコライザ
{
	public partial class Form1 : Form
	{
		// グラフィック･イコライザ全体の周波数応答を取得
		public Complex GetResponseAll(Complex u)
		{
			Complex hz = 1;
			for (int n=0; n<BANDS_; n++)
				hz = hz*filters_[n].GetResponse(u);
			return hz;
		}

		// グラフィック･イコライザで使うフィルタの定義
		private void GrEqDefinition()
		{
			for (int n=0; n<BANDS_; n++)
			{
				BiquadGrEq.Type t = BiquadGrEq.Type.PEAK;
				if (n == 0)			t = BiquadGrEq.Type.LSHL;
				if (n == BANDS_-1)	t = BiquadGrEq.Type.HSHL;
				filters_[n] = new BiquadGrEq(F0_MIN_*Pow(2, n), Q_VAL_, t, SAMPLING_FRQ_);
			}
		}

		// ブースト/カット量の取得
		private void MyScroll(object sender, EventArgs e)
		{
			int n = (int)((TrackBar)sender).Tag;	// TrackBar の番号を取得
			float db = bar_[n].Value/100.0f;
			filters_[n].SetCoefficients(db);
			pictureBox1.Invalidate();

			// 送信するデータのフォーマット
			//		最初の文字：TrackBar の番号（int型に対応）
			//		以降の文字：dB 値（float型に対応）
			string str = n.ToString("0") + db.ToString("0.##");
			sp_.SendTo(str);
		}

		// TrackBar 生成
		private void TrackBarGerator()
		{
			// TrackBar の幅（Orientation が Vertical の場合）はデフォルトで自動設定される
			Size tbSize = new Size(0, (int)(panel2.Size.Height));
			for (int n=0; n<BANDS_; n++)
			{
				bar_[n] = new TrackBar();
				bar_[n].Enabled = false;
				bar_[n].Location = new Point(24+n*49, 3);
				bar_[n].Size = tbSize;
				bar_[n].Maximum = 1000;		// +10 dB に対応
				bar_[n].Minimum = -1000;	// -10 dB に対応
				bar_[n].Orientation = Orientation.Vertical;
				bar_[n].Tag = n;
				bar_[n].TickFrequency = bar_[n].Maximum;
				bar_[n].TickStyle = TickStyle.TopLeft;
				bar_[n].Value = 0;
				bar_[n].Scroll += MyScroll;
				panel2.Controls.Add(bar_[n]);
			}
		}

		// 以下の Invoke(Action action) を定義しておけばプログラムの記述が楽になる
		//			たとえば，
		//		Invoke(new Action(() => label1.Text = "文字列"));
		//			と書く代わりに
		//		Invoke(() => label1.Text = "文字列");
		//			のように書ける
		private void Invoke(Action action) => base.Invoke(action);
	}
}
