objective-cをちょい研究!ブログ -44ページ目

objective-cをちょい研究!ブログ

WILLCOMを卒業してiOS開発者に転身しました。。
コメント&トラックバック大歓迎です。

今朝予告していた途中経過の公開ですが、実行ファイルとソースです。
http://www.ne.jp/asahi/phs/phs/blog/midi080218.lzh


キーボードのA行で白鍵盤(ド~ド~ミ)、Q行で黒鍵盤の演奏が
できるようにしました。
まだ低機能ですが、MIDI関連をDLL化したので他のソフトからでも
呼び出して使えるようにしました。


<課題1 和音時の鳴動が遅い>
LEDのON/OFFが原因でした。正確には、LEDをオンオフするたびに
shphonelib.dllをロード&開放という処理をしていてそれに時間が
かかってました。初回と最後のみモジュールのロードと開放することで
かなり速くなりました。


<課題2 背景画像の作成>
まだ背景画像を作ってませんが、同じフォルダに画像ファイルを置いて
あげると表示します。画面の縦横切り替えると、画像も切替できます。


h.gif(画面縦時の画像)、v.gif(画面横時の画像)


※LED関連のソースはこちらを参考にさせてもらいました。

http://blog.tauchi.net/2007/09/led.html
http://blog.tauchi.net/2007/10/led.html
LED制御/電波状態LEDの制御(tauchi.net様)

とりあえず、キーボード入力による演奏に対応しました。
途中経過ですが、実行ファイルとソースは近々アップします。


<課題1 IMEのOffができない>
IMEをOffする方法(08/02/15) は調べたんですが、ソースに埋め込んでも機能しない…???
どうやら、TextBoxなどの入力コントロールがある場合はForm_Loadに書いても
機能するんですが、画面に何にもコントロールが無い状態だとだめみたいです。
これはC++時にも同様の現象が起こってました。
http://www.ameblo.jp./willcom-phs/entry-10071861972.html (08/02/11)


いろいろ試したところ、ActivedでもだめでPaint処理でImeOffにする処理を記述
するとうまくいきました。
次に画像表示をしようと全画面サイズでPictureBoxコントロールを貼り付けたところ、
Paintイベントが発行されなくなってしまいました。描画される部分がなくなったので
当然ですが、PictureBoxを初期非表示にして、初回Paintイベント処理時にPictureBoxを
表示することで対応しました。


<課題2 アプリケーションのパスを取得する>
VB6だと、App.Pathという便利なプロパティがあるんですが、.Netだと使えない。
こんな方法で取得できました。ちなみにPC用なら、GetName.CodeBase→LocationでOKです。
Dim strPath As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.GetName.CodeBase)


http://d.hatena.ne.jp/unison/20060119
設定ファイル保存のための実行ファイルパス探し(unisonDiaryさん)


<課題3 和音時の鳴動が遅い>
同時に和音を鳴らそうとしてもワンテンポずれてしまいます。
音を鳴らす時に、鳴動→処理待ち→メモリ開放ということをやっていて、結構時間が
かかってる見たいです。

今日は1日遊びに出かけていたので、ソフト調査&製作は進んでません(^^;
ネタも無いので、むか~しに作ったPC用のソフトの紹介です。


パソコンのキーボードで引く電子ピアノです。
和音不可で電子音のような音しか出ないのでキーボードとしては貧弱ですが、
ノートパッド(メモ帳)の音楽版のような機能があります(???)
あと一応単音の着メロが作れますが、今は使われてないような形式ばっかりです(^^;
PDXメロディやきゃらメロディ、J-SKYメロディなどなど、対応機種使ってる人いるかなぁ…


http://www.ne.jp/asahi/phs/phs/softinfo01.html

アドエスメロディキーボードバージョンアップの課題です。


課題1 画像表示
画面が寂しいので画像を表示できるようにする。
画面にピクチャーボックスコントロールを配置して、ファイルを読み込む。

Dim Bitmap1 As Bitmap
Bitmap1 = New Bitmap("\Program Files\1.gif") //画像ファイル読込み
PictureBox1.Image = Bitmap1           //PictureBoxに画像設定

課題2 縦横切替
縦横切替の専用イベントがある訳ではなくて、Resize(WM_SIZE)イベントで判断するらしい。
ただ、起動時に4回、切替時に2回Resizeイベントが降ってくるので、サイズが変わったことを判定する変数を1つ用意しておく。
起動時は、Visible(画面表示フラグ)チェックをしてResize処理しないようにする。


起動時のイベント順
Resize(Visible=False)
Resize(Visible=False)
Form_Load
Resize(Visible=False)
Resize(Visible=True)


切替時のイベント
Resize(Width=新サイズ)
Resize(Width=新サイズ)


Dim lngBefSize As Long //画面幅を保存しておく変数


Private Sub Form1_Load(…) Handles MyBase.Load
  If Me.Width < Me.Height Then
  //縦の処理
  Else
  //横の処理
  End If

  lngBefSize = Me.Width //画面幅を退避
End Sub


Private Sub Form1_Resize(…) Handles MyBase.Resize
  //画面幅が変わった場合
  If lngBefSize <> Me.Width And Me.Visible = True Then
    If Me.Width < Me.Height Then
     //縦の処理
    Else
     //横の処理
    End If

    lngBefSize = Me.Width //画面幅を退避
  End If
End Sub


http://www.microsoft.com/japan/msdn/mobility/windowsmobile2003/screen_orientation_awareness.aspx
画面方向の切替えに対応したアプリケーションの開発(MSDN)


課題3 キー入力とIMEのON/OFF
IMEはImmSetOpenStatusでON/OFF切替できるそうです。
これを使って初期状態で半角入力モードに切替。


http://d.hatena.ne.jp/annin102/20071122/1195753333
入力モードを _1 に変更する方法(闇忍日記さん)
http://blog.goo.ne.jp/mypda/e/bd2e6a36e011e986ab907ea64f5778c7
ソース公開企画第3弾 TextCopy(w-zero3日和さん)


あとは、どのキーにどの音を割り当てるか。
実質3段しかないので、A段に白鍵盤、Q段に黒鍵盤を割り当て。
結局1オクターブしか入らないなぁ。仕様を考えるのが一番悩ましい…(^^;