[Homepage][BBS][YouTube][Blog]

エアーバリアブルBBS
エアーバリアブルBBS
初めにお読み下さい Please read first ホームページ ブログ YouTube 過去ログ倉庫
PICのオルゴールについて
PICで作る電子オルゴールについて質問です。
http://www.ne.jp/asahi/air/variable/picmel/applications/melody/

1)12F675,12F629ではなく12F683で作れますか?
2)melody(mplab7.62/PICC9.60対応版)を2和音(melodyd)にできますか?

もし上記質問が可能でしたらプログラムの変更点まで教えていただけると嬉しいです。
PICの知識に乏しく手探り状態ですがよろしくお願いします。
  • やまさん
  • 2011/06/09 (Thu) 23:52:10
Re: PICのオルゴールについて
1)12F675,12F629ではなく12F683で作れますか?
 ⇒可能でしょう
2)melody(mplab7.62/PICC9.60対応版)を2和音(melodyd)にできますか?
 ⇒プログラム次第でしょう

プログラムの変更点まで教えていただけると嬉しいです。
 ⇒自分でどこまでやったのですか? その上でなにが疑問なんですか? まったく自分ではやってなくて丸投げというのは論外ですよ
  • じゅん
  • 2011/06/11 (Sat) 02:32:37
Re: PICのオルゴールについて
まずは単音版を12F683に移植すべく、ビルドエラーが出ないように下のように変えました。

IOCB→IOCA
OSCCAL→無効
CMCON→CMCON0
OPTION→OPTION_REG
//__CONFIG(0x3fc4);→有効
__CONFIG(UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);→無効

これでとりあえずビルドエラーは出なくなり、書き込みにも成功しました。
音も鳴るには鳴るのですがプチップチッとノイズのような感じです。
LEDもプチプチノイズと連動して光っています。
  • やまさん
  • 2011/06/11 (Sat) 16:21:30
Re: PICのオルゴールについて
すみませんでした!!
プログラム中の#if _12F627を12F683に書き換えておらずプツプツノイズになっていました。
12F683に書き換えたところちゃんと音が鳴りました。

今から2和音版に改造してみます。
  • やまさん
  • 2011/06/11 (Sat) 22:35:51
Re: PICのオルゴールについて
移植に成功したのですね。一安心しました。

随分昔に作ったプログラムなので、見直せばもう少しきれいなコードにはなると思います。

この当時はHitech PICC Liteが12F683をサポートしていませんでしたが、今では色々なデバイスが使えます。ただ、その代わりとして、現在のPICCコンパイラは冗長コードを入れてくるので、音符が前より入らないかもしれません。
  • air_variable
  • URL
  • 2011/06/12 (Sun) 00:05:25
Re: PICのオルゴールについて
単音版を移植はできたのですが2和音にできません…。

単音版の曲データはmain関数外に書かれているのを
sleep_control();//sleep
while(1){
tmp=songdata[n];
tmp2=songdata[n+1];
};
で読み込んでいるようですが、

2和音版の曲データは、main関数の中に直接書かれていますよね。

スリープ機能もmain関数の中に書かれているので、曲データと一緒に書くにはどうすればいいのかわかりません。

tmp=songdata[n];
tmp2=songdata[n+1];
とか…。
  • やまさん
  • 2011/06/12 (Sun) 15:09:39
Re: PICのオルゴールについて
オルゴールプログラムは8年前にC言語の勉強を兼ねて作った物ですので、私がこれから移植や改良を行う事は恐らく行わないでしょう。
つきましては、プログラムのソースによる助言程度となります。

2和音ですが、グローバル変数として、toneとtone_bをタイマー0,1を使ってそれぞれのパートを和音として出力しています。
音が切り替わったパートがあれば、その音をセットするといった具合です。移植するには、timer1に関わる部分も修正する必要があります。

一応ミュージック・マクロ・ランゲージなる仕様書はあります。2重和音のプログラムは、単音のデータの作り方とは異なります。
http://www.ne.jp/asahi/air/variable/picmel/applications/melody/mmlspec.htm

2重和音がなった場合は、このサンプルの様に奏でます。しかし、これ以上の小節はメモリーの制約から入りませんでした。
http://www.ne.jp/asahi/air/variable/picmel/applications/melody/melody_sample_D.zip

2重和音のプログラムは、それ以上の改良が見込めなかったので、それ以上の追求は行いませんでした。C言語の習作として作った関係もあり、参考として公開しております。

なお、PICを使った和音オルゴールについては、
http://milky.geocities.jp/waewax/
の方が色々公開しておりますので、参考までにご紹介させていただきます。
  • air_variable
  • URL
  • 2011/06/12 (Sun) 16:58:17
Re: PICのオルゴールについて
詳細な解説ありがとうございます。
しかしこれ以上はどうあがいてもできませんでした。
曲データの仕様が異なるためまともに認識してくれません。

タイマー1の処理は変更した(つもりです)が、単音版に2和音の曲データをそのまま書いてもエラーが出てビルドできませんでした。
なにか解決法はないでしょうか。
http://u3.getuploader.com/pic16f774/download/28/main.c
http://u3.getuploader.com/pic16f774/download/27/error.gif
  • やまさん
  • 2011/06/13 (Mon) 01:55:23
Re: PICのオルゴールについて
ソースを拝見しました。エラーの画面を見ると数行直せばOKというわけにはいかず、C言語の事を理解する必要がありそうです。

例えば、148行目で、const char songdata[]={
にテンポや音符データを入れていますが、tempocont = 120; という所で既に破綻しているのです。
そこで使われている音符等も(FL、HA、 L8等)#defineで定義されるものが代入されます。
という事は、配列変数として到底扱えないデータに置換されてしまいます。配列変数と#defineの使い方を理解せずして、このプログラムを作成するのは、とても困難です。

和音を配列変数で出来ないかを考えての方法ですが、この方式では無理があります。別のアルゴリズムを考える必要があります。今、解決策を提案するとすれば、違いをよく理解して頂く以外に方法が見当たりません。これを私が行えば立派な開発案件となるでしょう。まずは背伸びをせずに、少しずつ行っていく事になります。

C言語について、市販の本やサイトを参考にして勉強していただければ幸いです。
  • air_variable
  • URL
  • 2011/06/13 (Mon) 02:23:18
Re: PICのオルゴールについて
ご指摘ありがとうございます。

単純に2つのプログラムを切り貼りすればできると思ったのですが、やはり初心者が簡単にできるものではないということですね。
勉強して地道に完成させたいと思います。
  • やまさん
  • 2011/06/13 (Mon) 09:58:53

返信フォーム






プレビュー (投稿前に内容を確認)