230131 yurikagoプロジェクト(orgel7_5対応)[2023年01月31日(Tue)]
【経緯】
愛用する PIC電子オルゴールが、新年早々に oregl7_5 にバージョンアップされた。
ご本家に倣い、当方の分家プロジェクトも orgel7_5_yurikago として公開する。
開発者のブログを拝見し、新バージョンでは半音単位の上下移調も動的変更が可能(いわゆる「曲中での転調」も可能)と知れば、是非とも試してみたいと思うのは当然。
今回もまた開発者にご指導いただきつつ、分家プロジェクトのバージョンアップと同時に、曲中での転調デモ曲データを作成する。
用意した楽譜は、文部省唱歌「虫の声」。
単純なメロディゆえに、リピートだけでは物足りず、「半音上げて」のリピートに期待したい。
「曲演奏途中での転調設定や、いかに?」
【新バージョンの確認】
「名張市つつじが丘おもちゃ病院」の関連ブログは必読。
(日々進化しているため、予告なく更新されることがある)
何はともあれ、本家の新バージョンを入手しないと始まらない。
ダウンロード・解凍したフォルダの中から、プロジェクトロケーションフォルダをコピーして、自分のパソコンにフォルダ丸ごと貼り付け。
当方で、パソコンのルートドライブである「C:」に貼り付けて、「C:\orgel7_5」というフォルダが出来上がる。
このフォルダ・パス名には多バイト文字を含まないように留意。(全角文字は、IDE で文字化けするため)
MPLAB X IDE から好みのプロジェクトを開いて、いよいよ、新バージョンの PIC電子オルゴールにご対面。
当方で、よく使うデバイスのプロジェクトを一つずつ開き、ビルドや書き込みでエラーが出ないことを一とおり確認。
今後は、ここを当方の作業場所「yurikagoプロジェクトロケーション」として区別するため、フォルダ名を「orgel7_5_yurikago」に変更。
【旧バージョンからの移行】
開発者のブログを熟読、新・旧バージョンの違いを見ると、アプリ記述部分は互換性が確認されているようだ。
既存レパートリーの曲データは、開発者により新バージョンに移行完了済。いつもながら、素早い対応に驚き!
アプリソースファイルは、旧バージョンの「orgel7_4_yurikago」用が、そのまま使えるが、SWの論理極性を事前に宣言する方式に改変。
プロジェクト(根のソース)ファイルも、旧バージョン用が、そのまま使える。SPI音声再生は2線接続でCVDタッチセンスも併せて実装できる。バージョン表記を更新。(SPI4線(3線)接続ではピン割当ての変更を要す)
昨年末にハマった、レトロ時計の目覚し機能復元プロジェクトも、同様に改変したうえでバージョン表記を更新して追加。
<yurikagoプロジェクト関連ファイルの移行>
apl_Alarm.asm 27KB(SW論理宣言を改変)
apl_yurikago.asm 24KB(SW論理宣言を改変)
yurikago_SW_15325.asm 25KB(旧 yurikago_15325_SW.asm を改変)
yurikago_SW_LF1840.asm 22KB(旧 yurikago_LF1840_SW.asm を改変)
Alarm_SW_1822.asm 15KB(旧 Alarm_1822_SW.asm のみ改変・追加)
追加・更新した当方のプロジェクトは、直後に再ビルドしてエラーが出ないことを確認。
なお、本家で公開されたサンプルプロジェクトの多くは、当方の分家プロジェクト内では割愛し、スリム化。
【新曲データ作成】
新曲データの作成では、新バージョンにおけるマクロ記述などの留意点や不明点もあり、今回も開発者にサポートを依頼。感謝申し上げる。
新バージョン移行済の曲データ、「となりのトトロ」を参照しつつ、当方では、先ず表計算ソフトのエクセルシート上で下書き。
音符一つ一つのデータ化ではエクセル関数や複数行の挿入複写を駆使して、単純反復作業をできるだけ軽減。
音高データは、階名読み(ドレミ)をローマ字入力するだけなので、とっても簡単。
<参考資料>
下書きができたら、IDEで新規ソースファイルを作成、エディタ画面上に必要個所を少しずつ(範囲指定)複写していく。
<新曲データ関連ファイル>
song_MUSIKOE.asm 2KB(新規追加)
onpu_MUSIKOE.asm 6KB(新規追加)
song.inc 11KB(既存ファイルに上書き更新)
採譜データ作成の全体的な作業時間は、従来の約半分くらいと体感。
開発者からは、虫の声も、アクセントになっていていい感じ、と好評価。
【ダウンロード】
【参考情報】
以下、曲データ採譜で必要な定義を抜粋して再掲する。
(内容は、2023年3月14日現在で更新済)
出典:下記リンク先は必読のこと。
(日々進化しているため、予告なく更新されることがある)
【Ver7_5での改善点】
@音高テーブルと音価テーブルを全曲共通にし、メモリ削減を行う。
A動的なキートランスポーズ機能をサポートする。
これは、音高テーブルを全曲共通にすることで実現可能になる。
Bonpuファイルで、音高コードはオクターブ+音名で指定できるようにする。
また音価コードは4分音符や8分音符などの音符の種類で記述できるようにする。
C制御用音符データの枠組みを1ワードの14ビットをフルに使うようにして、
波形データ切り替え以外の音符データは1ワードに収める。
【設計】
@キートランスポーズのやり方を変える、
・キートランスポーズの単位を半音階とすれば、音高コードを整数値で増減すれば済む。
つまり、移調するということ。
・音高テーブルを全曲共通にすることで、音符データでは音高コードとして
絶対的な音高(オクターブ番号+音名)を指定することが可能となる。
A音高テーブルの持ち方を変える。
・音高テーブルには(オクターブ番号+音名)を持たせて、(オクターブ番号+音名)を
サンプル飛び数へ変換するテーブルを別に設ける。
オクターブ番号は3ビット、音名は4ビット、合計7ビットで表すことができるので、
音高テーブルのメモリ量を半分にできる。
Bサポートする音高の範囲
・市販されているキーボードは61鍵盤の商品が多くあり、6ビットで表現可能な
63半音をorgelのサポート範囲とする。
・音高の具体的な範囲は65.4Hz(中央Doの2オクターブ下)〜2489Hz(Re)とする。
Cテンポの変更についてもキートランスポーズと同様の問題があった。
・テンポの変更は頻繁に起きることでないことと8ビット乗算で済むため、乗算を
ソフト実装することで対処する。
計算時間は20us以下であるため、演奏のアンダーランには至らない。
D音高テーブルと音価テーブルを全曲共通にすることで、
音符データで指定する音高コードはオクターブ+音名、音価コードは音符記号に替える。
これにより採譜がやり易くなる。
【実装】
音符データで記述する音価記号の定義
//========================================
//音価記号の定義
//========================================
#define kR32 1 //32分3連符
#define kR16 2 //16分3連符
#define kK32 3 //32分音符
#define kR8 4 //8分3連符
#define kP32 5 //付点32分音符
#define kK16 6 //16分音符
#define kR4 7 //4分3連符
#define kP16 8 //付点16分音符
#define kK8 9 //8分音符
#define kR2 10 //2分3連符
#define kP8 11 //付点8分音符
#define kK4 12 //4分音符
#define kR1 13 //全3連符
#define kP4 14 //付点4分音符
#define kK2 15 //2分音符
#define kP2 16 //付点2分音符
#define kK1 17 //全音符
#define kW80 18 //80
#define kW84 19 //84
#define kW168 20 //168
#define kW255 21 //255
kKは基本音符、kPは付点音符、kRは3連符を表す。
数字は4分音符では4、8分音符では8のように表す。
音符データで記述する音高記号の定義
//========================================
//音高記号の定義
//========================================
#define DoF -1
#define Do 0
#define DoS 1
#define ReF 1
#define Re 2
#define ReS 3
#define MiF 3
#define Mi 4
#define MiS 5
#define FaF 4
#define Fa 5
#define FaS 6
#define SoF 6
#define So 7
#define SoS 8
#define LaF 8
#define La 9
#define LaS 10
#define SiF 10
#define Si 11
#define SiS 12
12半音分のみを定義していて、これにオクターブ番号を付加して音高を指す。
オクターブ番号は、orgelの設計ではC2(65.4Hz)〜B2(123.5Hz)を0、
C3(130.8Hz)〜B3(246.9Hz)を1、と増加する。
音符データの設定マクロは以下のとおり
//========================================
//通常音符設定マクロ
//ttt:タイ・スラー(0=無し、1=有り)
//kkk:音価コード(1起算)
//ooo:オクターブ番号(0起算)
//nnn:音名コード(0起算)
//========================================
onp_mac macro ttt,kkk,ooo,nnn
dw kkk*256+ttt*128+ooo*12+nnn
endm
転調設定マクロは以下のとおり
//========================================
//カレントに対する転調設定マクロ
///kkk:カレントの調からの転調度[半音階](-15〜+15)
//==============================================
kec_mac macro kkk //転調度[半音階]
dw 0x0020+((kkk+16)&&0x1f) //バイアスを加算する
endm
可変範囲は−15〜+15で、転調設定マクロはどれか一つのパートのみで使う。
パラメータが「0」のときは転調設定を解除してSONGファイルの設定値に戻す。