class Spectrum // スペクトラム表示をするクラス { Pen pen = new Pen(Color.LightGray); //Magentaから変更 Pen green = new Pen(Color.LightGreen); Pen red = new Pen(Color.Red); SolidBrush white = new SolidBrush(Color.White); SolidBrush Blue = new SolidBrush(Color.Blue); //Blackから変更 SolidBrush yellow = new SolidBrush(Color.Yellow); Font font = new Font("MS UI Gothic", 8); // int bias = 80; // スペアナ表示の際のレベル調整値 int bias = 140; // スペアナ表示の際のレベル調整値変更 // // スペクトラムアナライザの描画 // public void Display(Graphics grfx, double[] spectrum, int style, double cursor) { int i, j, k; // grfx.FillRectangle(white, 0, 0, 512, 200); // 画面を白でクリア grfx.FillRectangle(Blue, 0, 0, 512, 200); // 画面を青でクリア if (style < 2) // 0-16K または -8k-8k(表示幅が16KHzの場合) { // for (i = 1; i < 8; i++) // 1KHzから7KHzまで描く for (i = 1; i < 8; i++) // 2KHzから14KHzまで描く { // grfx.DrawString(( i - ((style == 1) ? 4 : 0)).ToString() + "k", font, yellow, i * 64 - 8, 181);//周波数を表示 grfx.DrawString((2 * i - ((style == 1) ? 8 : 0)).ToString() + "k", font, yellow, i * 64 - 8, 181);//周波数を表示 grfx.DrawLine(green, i * 64, 0, i * 64, 180);// 緑で縦線を描画 } } else { // -16K to 16K 表示(表示幅が32KHzの場合) for (i = 1; i < 16; i++) // -14khzから14kHzまで描く { // grfx.DrawString((i - 8).ToString() + "k", font, yellow, i * 32 - 8, 181);// 周波数を表示 grfx.DrawString((2 * i - 16).ToString() + "k", font, yellow, i * 32 - 8, 181);// 周波数を表示 grfx.DrawLine(green, i * 32, 0, i * 32, 180); //緑で縦線を描画 } } for (i = 1; i < 9; i++) // dB表示の横線を描画する { grfx.DrawString("-" + (i * 10).ToString() + "dB", font, yellow, 480, i * 20 - 6);//dB表示を右側に grfx.DrawLine(green, 0, i * 20, 480, i * 20); // 緑で横線を描く } if (style == 0) { // 0KHzから16KHz表示モード? for (i = 2; i < 512; i+=2) { j = (int)(spectrum[i] * 2 + bias); // 表示座標を得る k = (int)(spectrum[i-2] * 2 + bias); // 表示座標を得る // if (j > 0) // 表示範囲か? grfx.DrawLine(pen, (i -2), 180 - k, i, 180 - j);//そうならマゼンタで描画する } if (cursor > 0 && cursor < 8.0) // 表示範囲内にカーソルがあるか? grfx.DrawLine(red, (int)(cursor * 64), 180, (int)(cursor * 64), 0);//そうなら赤で描画する } else if (style == 1) { // -8KHzから8KHz表示モード for (i = 0; i < 256; i++) // 左半分 { j = (int)(spectrum[i + 768] * 2 + bias); // 表示範囲を得る if (j > 0)// 表示範囲か? grfx.DrawLine(pen, i, 180, i, 180 - j); //そうならマゼンタで描画する } for (i = 0; i < 256; i++) // 右半分 { j = (int)(spectrum[i] * 2 + bias);// 表示範囲を得る if (j > 0)// 表示範囲か? grfx.DrawLine(pen, i + 256, 180, i + 256, 180 - j);//そうならマゼンタで描画する } if (Math.Abs(cursor) < 4.0) // 表示範囲内にカーソルがあるか? grfx.DrawLine(red, (int)(cursor * 64 + 256), 180, (int)(cursor * 64 + 256), 0);//そうなら赤で描画する } else { // -16Kから16K表示モード for (i = 2; i < 256; i+=2) // 左半分 { j = (int)(spectrum[i * 2 + 512] + spectrum[i * 2 + 513] + bias);// 表示範囲を得る(2点の平均を求める) k = (int)(spectrum[( i - 2) * 2 + 512] + spectrum[(i - 2) * 2 + 513] + bias);// 表示範囲を得る(2点の平均を求める) // if (j > 0)// 表示範囲か? // grfx.DrawLine(pen, i, 180, i, 180-j);//そうならマゼンタで描画する grfx.DrawLine(pen, i - 2, 180 - k, i , 180 - j);//そうならマゼンタで描画する } for (i = 2; i < 256; i+=2) // 右半分 { j = (int)(spectrum[i * 2] + spectrum[i * 2 + 1] + bias);// 表示範囲を得る(2点の平均を求める) k = (int)(spectrum[(i - 2) * 2 ] + spectrum[(i - 2) * 2 + 1] + bias);// 表示範囲を得る(2点の平均を求める) // if (j > 0)// 表示範囲か? grfx.DrawLine(pen, (i - 2)+ 256, 180 - k , i + 256, 180 - j);//そうならマゼンタで描画する } if (Math.Abs(cursor) < 8.0) // 表示範囲内にカーソルがあるか? grfx.DrawLine(red, (int)(cursor * 32 + 256), 180, (int)(cursor * 32 + 256), 0);//そうなら赤で描画する } grfx.DrawLine(green, 0, 180, 512, 180); // グラフの一番下の線を描く } }