前田稔(Maeda Minoru)の超初心者のプログラム入門
//★ WAV FILE ステレオ 16bit のメニューを設定する 前田 稔 using System; using System.Drawing; using System.Windows.Forms; using System.IO; public class MyForm : Form { static string file_name; static byte[] byt = new byte[70000000]; static int m_leng, m_idx, m_siz; public MyForm() { Width = 1200; Height = 700; Text = "Wave S16 Graph"; m_leng = -1; MainMenu menu = new MainMenu(); MenuItem item = menu.MenuItems.Add("ファイル(&F)"); item.MenuItems.Add(new MenuItem("WAV 入力(&R)", new EventHandler(this.Read))); item.MenuItems.Add(new MenuItem("WAV 出力(&W)", new EventHandler(this.Write))); item.MenuItems.Add(new MenuItem("終了(&X)", new EventHandler(this.FileExit), Shortcut.CtrlQ)); item = menu.MenuItems.Add("Volume(&H)"); item.MenuItems.Add(new MenuItem("5% Up(&I)", new EventHandler(this.Up5))); item.MenuItems.Add(new MenuItem("10% Up(&J)", new EventHandler(this.Up10))); item.MenuItems.Add(new MenuItem("20% Up(&K)", new EventHandler(this.Up20))); item.MenuItems.Add(new MenuItem("50% Up(&L)", new EventHandler(this.Up50))); item.MenuItems.Add(new MenuItem("100% Up(&L)", new EventHandler(this.Up100))); item.MenuItems.Add(new MenuItem("5% Down(&M)", new EventHandler(this.Down5))); item.MenuItems.Add(new MenuItem("10% Down(&N)", new EventHandler(this.Down10))); item.MenuItems.Add(new MenuItem("20% Down(&O)", new EventHandler(this.Down20))); item.MenuItems.Add(new MenuItem("50% Down(&P)", new EventHandler(this.Down50))); item.MenuItems.Add(new MenuItem("Auto Vol(&X)", new EventHandler(this.Auto))); item = menu.MenuItems.Add("無音(&N)"); item.MenuItems.Add(new MenuItem("前部削除(&M)", new EventHandler(this.Del))); item.MenuItems.Add(new MenuItem("無音削除(&M)", new EventHandler(this.AutoDel))); item.MenuItems.Add(new MenuItem("無音挿入(&O)", new EventHandler(this.Ins))); item.MenuItems.Add(new MenuItem("後部削除(&P)", new EventHandler(this.BDel))); item.MenuItems.Add(new MenuItem("後部挿入(&Q)", new EventHandler(this.BIns))); item = menu.MenuItems.Add("ヘルプ(&H)"); item.MenuItems.Add(new MenuItem("バージョン情報(&A)...", new EventHandler(this.HelpAbout))); this.Menu = menu; Paint += new PaintEventHandler(MyHandler); } // 入出力メニュー private void Read(object sender, EventArgs e) { OpenFileDialog opendlg = new OpenFileDialog(); opendlg.Filter = "WAVE ファイル|*.wav|すべてのファイル (*.*)|*.*" ; if (opendlg.ShowDialog() == DialogResult.OK) { file_name = opendlg.FileName; } m_siz = WavRead(); Text = file_name; Invalidate(); } private void Write(object sender, EventArgs e) { if (m_leng==-1) return; SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "WAVE ファイル|*.wav;|すべてのファイル|*.*"; if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) { FileStream writer = File.Create(saveFileDialog1.FileName); writer.Write(byt,0,m_leng); writer.Close(); Console.Write("complete"); } saveFileDialog1.Dispose(); } // ボリューム設定メニュー private void Up5(object sender, EventArgs e) { Volume((float)1.05); } private void Up10(object sender, EventArgs e) { Volume((float)1.1); } private void Up20(object sender, EventArgs e) { Volume((float)1.2); } private void Up50(object sender, EventArgs e) { Volume((float)1.5); } private void Up100(object sender, EventArgs e) { Volume((float)2.0); } private void Down5(object sender, EventArgs e) { Volume((float)0.95); } private void Down10(object sender, EventArgs e) { Volume((float)0.9); } private void Down20(object sender, EventArgs e) { Volume((float)0.8); } private void Down50(object sender, EventArgs e) { Volume((float)0.5); } private void Auto(object sender, EventArgs e) { AutoVol(); } // 前部の削除(300000 byte) private void Del(object sender, EventArgs e) { int i,idx; m_siz -= 300000; m_leng -= 300000; for(i=0; i<m_siz; i++) { idx = m_idx+i; byt[idx] = byt[idx+300000]; } set_int(4, m_leng); // File Length set_int(m_siz, m_idx-4); // Data Size Invalidate(); } // 無音の自動削除 private void AutoDel(object sender, EventArgs e) { int i,idx,pt; short v; for(pt=i=0; i<m_siz; i+=2) { idx = m_idx+i; v = get_short(idx); if (v>5) break; pt = i; } m_siz -= pt; m_leng -= pt; for(i=0; i<m_siz; i++) { idx = m_idx+i; byt[idx] = byt[idx+pt]; } set_int(4, m_leng); set_int(m_siz, m_idx-4); MessageBox.Show(pt.ToString()); Invalidate(); } // 無音の挿入(300000 byte) private void Ins(object sender, EventArgs e) { int i,idx; for(i=m_siz-1; i>=0; i--) { idx = m_idx+i; byt[idx+300000] = byt[idx]; } for(i=0; i<300000; i++) { idx = m_idx+i; byt[idx] = 0; } m_siz += 300000; m_leng += 300000; set_int(4, m_leng); set_int(m_siz, m_idx-4); Invalidate(); } // 後部の削除(300000 byte) private void BDel(object sender, EventArgs e) { m_siz -= 300000; m_leng -= 300000; set_int(4, m_leng); set_int(m_siz, m_idx-4); Invalidate(); } // 後部無音の挿入(300000 byte) private void BIns(object sender, EventArgs e) { int i,idx; for(i=0; i<300000; i++) { idx = m_idx+m_siz+i; byt[idx] = 0; } m_siz += 300000; m_leng += 300000; set_int(4, m_leng); set_int(m_siz, m_idx-4); Invalidate(); } // ファイル-終了メニューのイベントハンドラ private void FileExit(object sender, EventArgs e) { this.Close(); } // ヘルプ-バージョン情報メニューのイベントハンドラ private void HelpAbout(object sender, EventArgs e) { MessageBox.Show("Wave Graph S16 by Maeda Minoru"); } // ウインドウの描画 private void MyHandler(object sender, PaintEventArgs e) { int i, idx, dt, wk; short v; Graphics g = e.Graphics; g.DrawLine(new Pen(Color.Black),100,100,1100,100); g.DrawLine(new Pen(Color.Black,3),100,200,1100,200); g.DrawLine(new Pen(Color.Black), 100, 300, 1100, 300); g.DrawLine(new Pen(Color.Black, 3), 100, 400, 1100, 400); g.DrawLine(new Pen(Color.Black), 100, 500, 1100, 500); if (m_leng==-1) return; dt = m_siz/1000; if (dt%2==1) dt++; for (i=0; i<1000; i++) { if (i*dt>=m_siz) break; idx = m_idx + i*dt; v = (short)get_short(idx); wk = v/327; if (wk<0) wk = 0-wk; if (v < 0) g.DrawLine(new Pen(Color.Blue), 100+i, 200-wk, 100+i, 200); else g.DrawLine(new Pen(Color.Blue), 100+i, 200, 100+i, 200+wk); idx+=2; v = (short)get_short(idx); wk = v/327; if (wk<0) wk = 0-wk; if (v < 0) g.DrawLine(new Pen(Color.Red), 100+i, 400-wk, 100+i, 400); else g.DrawLine(new Pen(Color.Red), 100+i, 400, 100+i, 400+wk); } } // WAVE FILE の入力 private int WavRead() { int siz; //Data Size int ix; //byt Index if (!File.Exists(file_name)) return -1; FileStream reader = File.Open(file_name,FileMode.Open); m_leng= reader.Read(byt,0,byt.Length); reader.Close(); if (get_str(0)!="RIFF") { MessageBox.Show("Header RIFF Error"); return -1; } if (get_str(8)!="WAVE") { MessageBox.Show("Header WAVE Error"); return -1; } ix = 12; if (get_str(ix) != "fmt ") { ix += get_int(ix+4)+8; if (get_str(ix) != "fmt ") { MessageBox.Show("Header fmt Error"); return -1; } } if (get_short(ix+8) != 1) { MessageBox.Show("Format Error"); return -1; } if (get_short(ix+10) != 2) { MessageBox.Show("Format Error"); return -1; } ix += get_int(ix+4)+8; if (get_str(ix) != "data") { ix += get_int(ix+4)+8; if (get_str(ix) != "data") { MessageBox.Show("Header data Error"); return -1; } } siz = get_int(ix+4); //byt[ix]=="data" m_idx = ix + 8; return siz; } // ボリュームの調整 private void Volume(float rate) { int i,idx; float fv; short v; for (i=0; i<m_siz; i+=2) { idx = m_idx+i; fv = (float)get_short(idx); fv = fv * rate; if (fv>32767) fv = 32767; if (fv<-32767) fv = -32767; v = (short)fv; set_short(v, idx); } Invalidate(); } // ボリュームの自動設定 private void AutoVol() { int i,idx; short mx,v; float r; mx = (short)0; for (i=0; i<m_siz; i+=2) { idx = m_idx+i; v = get_short(idx); if (mx<v) mx = v; } r = (float)12000 / (float)mx; // MP3Gain に合わす //r = (float)30000 / (float)mx; Volume(r); MessageBox.Show(mx.ToString() + " : " + r.ToString()); } //☆ get_str() 関数, get_short() 関数, get_int() 関数, set_short() 関数, set_int() 関数の定義 } class Draw { [STAThread] public static void Main() { MyForm mf = new MyForm(); Application.Run(mf); } } |
static int m_leng; //File Length static int m_idx; //Data が格納されている先頭 Index static int m_siz; //Data の Size(Byte) |
[Previous Chapter ↑] Graph S16