Download
Magazine
Develop
Account
Download
Magazine
Develop
Login
Forgot Account/Password
Create Account
Language
Help
Language
Help
×
Login
Login Name
Password
×
Forgot Account/Password
Category:
Software
People
PersonalForge
Magazine
Wiki
Search
OSDN
>
Find Software
>
Multimedia
>
Sound/Audio
>
Editors
>
OpenMIDIProject
>
Forums
>
おーぷんMIDIぷろじぇくとフォーラム
>
MIDIDataLib7.1のMIDIEvent構造体について
OpenMIDIProject
Description
Project Summary
Developer Dashboard
Web Page
Developers
Image Gallery
List of RSS Feeds
Activity
Statistics
History
Downloads
List of Releases
Stats
Communication
List of Forums
おーぷんMIDIぷろじぇくとフォーラム (415)
OpenMIDIProject forum (436)
News
Forums:
おーぷんMIDIぷろじぇくとフォーラム
(Thread #48264)
Return to Thread list
RSS
MIDIDataLib7.1のMIDIEvent構造体について (2023-02-10 10:38 by
usa3usa
#93809)
Reply
何度も質問ばかりで失礼します。
昔BCCで作成したプログラムを改造してMIDIDataライブラリを使えるように苦労しているところです。
(ライブラリの形式がCOFF形式なのがダメなようなので OMF形式に変換してみましたが、やはりうまくいっていません)
なお、VS2008で作成したプログラムの改造では、MIDIDataライブラリが使えてます。
そんな中、MIDIDataLib7.1\MIDIData.cを読ませて頂いています。
かなり質の高いプログラムで関心しているところですが、一つ疑問に思った点がありましたので質問させてください。
なぜ可変長のMIDIEvent構造体を使わないのでしょうか?
MIDIイベント(可変長)を現在のMIDIEvent構造体では、
long m_lLen; /* イベントのデータ長さ[バイト] */
unsigned char* m_pData; /* イベントのデータバッファへのポインタ */
unsigned long m_lData; /* イベントのデータバッファ(MIDIチャンネルイベントのとき使う) */
とし、
pEvent->m_pData = (unsigned char*)(&(pEvent->m_lData)); /* MIDIチャンネルイベントのとき */
pEvent->m_pData = malloc (lLen); /* SysExかメタイベントの場合は、外部にデータバッファを確保する。 */
で記録していますね。
長さが不定なので外部にバッファを取っているようですが、
m_lDataを可変長にして構造体末尾に移動
させれば済む話の気がします。
また、unsigned long m_lData となっていますが、m_lDataを引用するとき 毎回(unsigned char*)をつけているので、初めから unsigned char m_lData[4] の方がわかりやすいのでは?
具体的には、
ポインタm_pDataをやめ、末尾に可変長(とりあえず3バイト)の unsigned char m_lData[3] だけとし、
/* MIDIイベントオブジェクト用バッファの確保 */
pEvent = calloc (sizeof (MIDIEvent) + lLen - 3, 1);
とすれば、簡潔になると思います。
もちろん lLenはランニングステータスを考慮した修正後の値を使用します
可変長の構造体にすると何か不都合がある(予想されている)のでしたら、教えていただければ幸いです。
Reply to #93809
×
Subject
Body
Reply To Message #93809 > 何度も質問ばかりで失礼します。 > 昔BCCで作成したプログラムを改造してMIDIDataライブラリを使えるように苦労しているところです。 > (ライブラリの形式がCOFF形式なのがダメなようなので OMF形式に変換してみましたが、やはりうまくいっていません) > なお、VS2008で作成したプログラムの改造では、MIDIDataライブラリが使えてます。 > そんな中、MIDIDataLib7.1\MIDIData.cを読ませて頂いています。 > かなり質の高いプログラムで関心しているところですが、一つ疑問に思った点がありましたので質問させてください。 > > なぜ可変長のMIDIEvent構造体を使わないのでしょうか? > > MIDIイベント(可変長)を現在のMIDIEvent構造体では、 > long m_lLen; /* イベントのデータ長さ[バイト] */ > unsigned char* m_pData; /* イベントのデータバッファへのポインタ */ > unsigned long m_lData; /* イベントのデータバッファ(MIDIチャンネルイベントのとき使う) */ > とし、 > pEvent->m_pData = (unsigned char*)(&(pEvent->m_lData)); /* MIDIチャンネルイベントのとき */ > pEvent->m_pData = malloc (lLen); /* SysExかメタイベントの場合は、外部にデータバッファを確保する。 */ > で記録していますね。 > > 長さが不定なので外部にバッファを取っているようですが、 > m_lDataを可変長にして構造体末尾に移動 > させれば済む話の気がします。 > また、unsigned long m_lData となっていますが、m_lDataを引用するとき 毎回(unsigned char*)をつけているので、初めから unsigned char m_lData[4] の方がわかりやすいのでは? > > 具体的には、 > ポインタm_pDataをやめ、末尾に可変長(とりあえず3バイト)の unsigned char m_lData[3] だけとし、 > /* MIDIイベントオブジェクト用バッファの確保 */ > pEvent = calloc (sizeof (MIDIEvent) + lLen - 3, 1); > とすれば、簡潔になると思います。 > もちろん lLenはランニングステータスを考慮した修正後の値を使用します > > 可変長の構造体にすると何か不都合がある(予想されている)のでしたら、教えていただければ幸いです。
You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.)
Login
Nickname
Preview
Post
Cancel
Re: MIDIDataLib7.1のMIDIEvent構造体について (2023-02-10 21:26 by
kuzu
#93822)
Reply
MIDIEventのデータ部は、MIDIチャンネルイベントのみm_lDataの領域を使い、
メタイベント・システムエクスクルーシブイベントは、
簡便のためデータの長さに関わらずm_pData=mallocとしています。
このように使い分けているのは、malloc/callocは遅い関数で、
なるべく使用頻度を減らしたいためです。
一般的にMIDIデータの中身はほとんどMIDIチャンネルイベントなので、
m_lDataの領域があれば、データ部用のmallocが発生する頻度を大幅に抑えられます。
どちらが使われている場合でも、m_pDataはデータ部を指すようにしております。
ご指摘の通り、long m_lDataは、unsigned char m_ucData[4]でも構いません。
しかし、unsigned char m_ucData[3]は、動かなくはありませんが、お勧めしません。
構造体においてunsigned char型を使い、変数が4バイト境界にそろっていない場合、
構造体に「穴が開く」ことが多いので、それを恐れてlongを使用しました。
仮に1バイトも穴があかず、前詰めで実行ファイルが生成された場合、
4バイト境界にそろっていない変数へのアクセスは遅くなります。
今は64bitの時代なので、OSやコンパイラの設定によっては、
8バイト境界に変数をそろえないと「穴が開く」かもしれませんし、低速になるかもしれません。
25年前の開発時は16bit→32bitの時代だったので、強制的に4バイト境界に設計しました。
>可変長の構造体にすると何か不都合がある(予想されている)のでしたら、教えていただければ幸いです。
MIDIDataライブラリは、単に演奏させるだけでなく、演奏させたままの状態で、
常にリアルタイムでイベントの追加・変更・削除が行わることを前提として作られています。
たとえばテキストイベントの「あいうえお」が「あいうえおかきくけこ」に変更された場合、
メモリ領域が足りなくなるので、MIDIEvent構造体ごと削除して、新しいMIDIEvent構造体を
malloc/callocすることとなりますが、そうするとMIDIEventのアドレスが変わってしまい、
このMIDIEventを指しているポインタがすべて失効してしまいます。
イベントの内容が変更されても、そのMIDIEvent構造体のアドレスは変わらないようにするために、
MIDIEventは固定長構造体とし、データ部をメタイベントとSYSEXのみ別途可変長としております。
Reply to
#93809
Reply to #93822
×
Subject
Body
Reply To Message #93822 > MIDIEventのデータ部は、MIDIチャンネルイベントのみm_lDataの領域を使い、 > メタイベント・システムエクスクルーシブイベントは、 > 簡便のためデータの長さに関わらずm_pData=mallocとしています。 > > このように使い分けているのは、malloc/callocは遅い関数で、 > なるべく使用頻度を減らしたいためです。 > 一般的にMIDIデータの中身はほとんどMIDIチャンネルイベントなので、 > m_lDataの領域があれば、データ部用のmallocが発生する頻度を大幅に抑えられます。 > どちらが使われている場合でも、m_pDataはデータ部を指すようにしております。 > > ご指摘の通り、long m_lDataは、unsigned char m_ucData[4]でも構いません。 > しかし、unsigned char m_ucData[3]は、動かなくはありませんが、お勧めしません。 > > 構造体においてunsigned char型を使い、変数が4バイト境界にそろっていない場合、 > 構造体に「穴が開く」ことが多いので、それを恐れてlongを使用しました。 > 仮に1バイトも穴があかず、前詰めで実行ファイルが生成された場合、 > 4バイト境界にそろっていない変数へのアクセスは遅くなります。 > 今は64bitの時代なので、OSやコンパイラの設定によっては、 > 8バイト境界に変数をそろえないと「穴が開く」かもしれませんし、低速になるかもしれません。 > 25年前の開発時は16bit→32bitの時代だったので、強制的に4バイト境界に設計しました。 > > >可変長の構造体にすると何か不都合がある(予想されている)のでしたら、教えていただければ幸いです。 > > MIDIDataライブラリは、単に演奏させるだけでなく、演奏させたままの状態で、 > 常にリアルタイムでイベントの追加・変更・削除が行わることを前提として作られています。 > > たとえばテキストイベントの「あいうえお」が「あいうえおかきくけこ」に変更された場合、 > メモリ領域が足りなくなるので、MIDIEvent構造体ごと削除して、新しいMIDIEvent構造体を > malloc/callocすることとなりますが、そうするとMIDIEventのアドレスが変わってしまい、 > このMIDIEventを指しているポインタがすべて失効してしまいます。 > イベントの内容が変更されても、そのMIDIEvent構造体のアドレスは変わらないようにするために、 > MIDIEventは固定長構造体とし、データ部をメタイベントとSYSEXのみ別途可変長としております。
You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.)
Login
Nickname
Preview
Post
Cancel
Re: MIDIDataLib7.1のMIDIEvent構造体について (2023-02-14 15:47 by
usa3usa
#93864)
Reply
解説ありがとうございます
以下は修正を希望するわけではありませんが、私の個人的な感想です。
>このように使い分けているのは、malloc/callocは遅い関数で、
>なるべく使用頻度を減らしたいためです。
malloc/callocの使用を減らしたいのであれば、逆に可変長にしておけば、メタイベントとSYSEXのデータ部を別途MIDIEvent構造体とは別に確保する必要が無くなる気がします。
>MIDIDataライブラリは、単に演奏させるだけでなく、演奏させたままの状態で、
>常にリアルタイムでイベントの追加・変更・削除が行わることを前提として作られています。
確かに、イベントの内容が変更された場合、チャンネルイベントの場合はデータ部を修正するだけで済みますが、
メタイベントとSYSEXの場合は、MIDIEvent構造体のアドレスが変わってしまいますね。
一方、演奏中にイベントの追加・削除もするということですので、当然これらの構造体のアドレスの操作は必要になる訳で、チャンネルイベントの変更にだけ特段の配慮をしなくても問題ない気がします。
>しかし、unsigned char m_ucData[3]は、動かなくはありませんが、お勧めしません。
long m_lLen;を
unsigned char m_lLen;
とすれば、
するとイベントのデータ長さ[バイト]は最大255になりますが、
構造体のサイズは4の倍数になり、「穴を開けずに」済むと思います。
Reply to
#93822
Reply to #93864
×
Subject
Body
Reply To Message #93864 > 解説ありがとうございます > 以下は修正を希望するわけではありませんが、私の個人的な感想です。 > > >このように使い分けているのは、malloc/callocは遅い関数で、 > >なるべく使用頻度を減らしたいためです。 > malloc/callocの使用を減らしたいのであれば、逆に可変長にしておけば、メタイベントとSYSEXのデータ部を別途MIDIEvent構造体とは別に確保する必要が無くなる気がします。 > > >MIDIDataライブラリは、単に演奏させるだけでなく、演奏させたままの状態で、 > >常にリアルタイムでイベントの追加・変更・削除が行わることを前提として作られています。 > 確かに、イベントの内容が変更された場合、チャンネルイベントの場合はデータ部を修正するだけで済みますが、 > メタイベントとSYSEXの場合は、MIDIEvent構造体のアドレスが変わってしまいますね。 > 一方、演奏中にイベントの追加・削除もするということですので、当然これらの構造体のアドレスの操作は必要になる訳で、チャンネルイベントの変更にだけ特段の配慮をしなくても問題ない気がします。 > > >しかし、unsigned char m_ucData[3]は、動かなくはありませんが、お勧めしません。 > long m_lLen;を > unsigned char m_lLen; > とすれば、 > するとイベントのデータ長さ[バイト]は最大255になりますが、 > 構造体のサイズは4の倍数になり、「穴を開けずに」済むと思います。
You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.)
Login
Nickname
Preview
Post
Cancel
Re: MIDIDataLib7.1のMIDIEvent構造体について (2023-02-17 20:32 by
kuzu
#93938)
Reply
>long m_lLen;を
>unsigned char m_lLen;
>とすれば、
>するとイベントのデータ長さ[バイト]は最大255になりますが、
>構造体のサイズは4の倍数になり、「穴を開けずに」済むと思います。
SMFでは、データ部の長さは可変長整数で格納されており、256バイト以上になることがあり得ます。
(ただし、長すぎるテキストイベントやシステムエクスクルーシブイベントを入れるのは、
機器の仕様上仕方ない場合を除き、あまりお勧めはされていません。)
可用性上、MIDIDataライブラリ側では制限を設けず、上層のプログラマが最大何バイトまで対応するか、
あるいはMIDIEvent_Create等に失敗しない限り無制限に受け入れるか決めていただく仕組みです。
Reply to
#93864
Reply to #93938
×
Subject
Body
Reply To Message #93938 > >long m_lLen;を > >unsigned char m_lLen; > >とすれば、 > >するとイベントのデータ長さ[バイト]は最大255になりますが、 > >構造体のサイズは4の倍数になり、「穴を開けずに」済むと思います。 > > SMFでは、データ部の長さは可変長整数で格納されており、256バイト以上になることがあり得ます。 > (ただし、長すぎるテキストイベントやシステムエクスクルーシブイベントを入れるのは、 > 機器の仕様上仕方ない場合を除き、あまりお勧めはされていません。) > > 可用性上、MIDIDataライブラリ側では制限を設けず、上層のプログラマが最大何バイトまで対応するか、 > あるいはMIDIEvent_Create等に失敗しない限り無制限に受け入れるか決めていただく仕組みです。
You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.)
Login
Nickname
Preview
Post
Cancel
Re: MIDIDataLib7.1のMIDIEvent構造体について (2023-02-19 15:48 by
usa3usa
#93973)
Reply
更なる解説ありがとうございます。
以下の内容は、決して現状のMIDIDataLibを否定しているわけではないこと、予めお断りしておきます。もしご気分を損ねるようなことがあれば申し訳ありません。
昔聴いた話ですが、
例外の無い完璧なプログラムを作成することは大事だが、
例外を恐れて無駄が出てしまうとか、煩雑な処理になり過ぎてしまうようならば、
例外を承知で簡潔なプログラミングを行い、
煩雑な例外処理は別途用意するという方法もある。
というものです。
実際、MIDIDataLibでも、m_lDataの領域を構造体内部と構造体外部の両方を使い分けていますよね。
ならば、いっそのこと、
可変長構造体にしてm_lDataの領域を構造体内部にしたらよいのでは
とお聞きしました。
その後、m_lLenを1バイトにすれば、
>イベントのデータ長さ[バイト]は最大255になりますが、
>構造体のサイズは4の倍数になり、「穴を開けずに」済むと思います。
との小生の提案に対し、
>SMFでは、データ部の長さは可変長整数で格納されており、256バイト以上になることがあり得ます。
との解説を頂きました。
今回の場合、「1バイトのLENで収まらない場合」を例外処理として、例えば「LEN=0として新たな様式を用意する」に持ち込めばよい気がします。例えば、
unsigned char m_lLen; // イベントのデータ長さ[バイト]
unsigned char* m_pData; // m_lLen==0の場合はm_pData[0-3]を長さにしてm_pData[4]以降にデータを保存
とでもすれば可能な気がします。
Reply to
#93938
Reply to #93973
×
Subject
Body
Reply To Message #93973 > 更なる解説ありがとうございます。 > 以下の内容は、決して現状のMIDIDataLibを否定しているわけではないこと、予めお断りしておきます。もしご気分を損ねるようなことがあれば申し訳ありません。 > > 昔聴いた話ですが、 > 例外の無い完璧なプログラムを作成することは大事だが、 > 例外を恐れて無駄が出てしまうとか、煩雑な処理になり過ぎてしまうようならば、 > 例外を承知で簡潔なプログラミングを行い、 > 煩雑な例外処理は別途用意するという方法もある。 > というものです。 > > 実際、MIDIDataLibでも、m_lDataの領域を構造体内部と構造体外部の両方を使い分けていますよね。 > ならば、いっそのこと、 > 可変長構造体にしてm_lDataの領域を構造体内部にしたらよいのでは > とお聞きしました。 > その後、m_lLenを1バイトにすれば、 > >イベントのデータ長さ[バイト]は最大255になりますが、 > >構造体のサイズは4の倍数になり、「穴を開けずに」済むと思います。 > との小生の提案に対し、 > > >SMFでは、データ部の長さは可変長整数で格納されており、256バイト以上になることがあり得ます。 > との解説を頂きました。 > > 今回の場合、「1バイトのLENで収まらない場合」を例外処理として、例えば「LEN=0として新たな様式を用意する」に持ち込めばよい気がします。例えば、 > unsigned char m_lLen; // イベントのデータ長さ[バイト] > unsigned char* m_pData; // m_lLen==0の場合はm_pData[0-3]を長さにしてm_pData[4]以降にデータを保存 > > とでもすれば可能な気がします。
You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.)
Login
Nickname
Preview
Post
Cancel
Re: MIDIDataLib7.1のMIDIEvent構造体について (2023-02-19 21:49 by
kuzu
#93976)
Reply
>今回の場合、「1バイトのLENで収まらない場合」を例外処理として、例えば「LEN=0として新たな様式を用意する」に持ち込>めばよい気がします。例えば、
> unsigned char m_lLen; // イベントのデータ長さ[バイト]
> unsigned char* m_pData; // m_lLen==0の場合はm_pData[0-3]を長さにしてm_pData[4]以降にデータを保存
>とでもすれば可能な気がします。
LEN=0のメタイベントもありますので、0以外(例:-1)でマークする必要があるのと、
LENがunsigned char型だと1変数ごとに整列するのでたぶん構造体に穴が開きます……。
という細かな問題はさておき、実装方法についてはいろいろな案があると思いますが、
(a)4バイトを境界に固定エリア使用と別途mallocを切り替えるか、
(b)256バイトを境界に固定エリア使用と別途mallocを切り替えるか、
(c)MIDIEvent構造体自体を可変長とするか、
は、
(a)多数発生する構造体のコンパクトさを優先にして、別途mallocの回数を若干あきらめるか、
(b)多数発生する構造体のコンパクトさを犠牲にして、別途mallocの回数を極限まで抑えるか、
(c)内容変更であっても上層のプログラマにMIDIEvent構造体へのポインタを正しく指し直すことを要求するか、
という作者の設計スタンスや感性の違いになってきますし、
メモリをどのぐらい搭載・消費できるのかという時代背景によっても違ってきますし、
ライブラリを誰が何の目的で使う予定なのかによっても異なってきます。
場合によってはmallocは危ないので使用禁止というのもあります(すべて完全固定長)。
MIDIDataLibの場合は(a)を採用しています。
イベントの種類で切り替えているので厳密には4バイト切り替えではありませんが、
大部分を占めるチャンネルイベントが別途malloc不使用となれば良いと思った次第です。
あと、メタイベントとSYSEXイベントは、SMFに長さ領域が確保されているので、
本質的に可変長(例外扱いできない)で、将来性を考えるとこれを軽視するわけにはいきませんでした。
(b)でなく(a)なのは、
開発当初のパソコン(Windows95)は、メモリが16MBのパソコンが普通でしたので、
メモリの有効活用のため、MIDIEvent構造体をなるべくコンパクトにしたかったためです。
現在においても消費メモリ量が少なくて済みます。
(c)を辞めているのは、
MIDIEvent構造体のサイズがイベントの内容によらず固定長で、
内容変更では上層プログラマにポインタの指し直しを要求しないことも重視したためです。
ポインタいじりはバグの温床となりますので、同じものを指している限り変わらないのが理想です。
FILE* pFileの値がfopenからfcloseまでの間に変わってしまうと困るのと同じ意味です。
なお、上層プログラマから見て、常にm_lLenが正しいデータ長を表し、
常にm_pDataはデータのアドレスを指すようにすることで、
固定領域・malloc領域のどちらが使われているかは気にする必要がない(隠蔽されている)
ようにしてあります(バグがなければ)。
時に、MIDIの特徴を考え、わたしのスタンス・感性でこのような方法を採用しましたが、
人によって別の手法を採用すると思いますし、
良いものが出来上がればそれぞれが正解だと思います。
今回ソースを読んでいただくことで、データ構造とアルゴリズムの話ができ、
わたしも開発当初の気持ちを思い出すことができて、良かったと思います。
Reply to
#93973
Reply to #93976
×
Subject
Body
Reply To Message #93976 > >今回の場合、「1バイトのLENで収まらない場合」を例外処理として、例えば「LEN=0として新たな様式を用意する」に持ち込>めばよい気がします。例えば、 > > unsigned char m_lLen; // イベントのデータ長さ[バイト] > > unsigned char* m_pData; // m_lLen==0の場合はm_pData[0-3]を長さにしてm_pData[4]以降にデータを保存 > >とでもすれば可能な気がします。 > > LEN=0のメタイベントもありますので、0以外(例:-1)でマークする必要があるのと、 > LENがunsigned char型だと1変数ごとに整列するのでたぶん構造体に穴が開きます……。 > > という細かな問題はさておき、実装方法についてはいろいろな案があると思いますが、 > > (a)4バイトを境界に固定エリア使用と別途mallocを切り替えるか、 > (b)256バイトを境界に固定エリア使用と別途mallocを切り替えるか、 > (c)MIDIEvent構造体自体を可変長とするか、 > > は、 > > (a)多数発生する構造体のコンパクトさを優先にして、別途mallocの回数を若干あきらめるか、 > (b)多数発生する構造体のコンパクトさを犠牲にして、別途mallocの回数を極限まで抑えるか、 > (c)内容変更であっても上層のプログラマにMIDIEvent構造体へのポインタを正しく指し直すことを要求するか、 > > という作者の設計スタンスや感性の違いになってきますし、 > メモリをどのぐらい搭載・消費できるのかという時代背景によっても違ってきますし、 > ライブラリを誰が何の目的で使う予定なのかによっても異なってきます。 > 場合によってはmallocは危ないので使用禁止というのもあります(すべて完全固定長)。 > > MIDIDataLibの場合は(a)を採用しています。 > イベントの種類で切り替えているので厳密には4バイト切り替えではありませんが、 > 大部分を占めるチャンネルイベントが別途malloc不使用となれば良いと思った次第です。 > あと、メタイベントとSYSEXイベントは、SMFに長さ領域が確保されているので、 > 本質的に可変長(例外扱いできない)で、将来性を考えるとこれを軽視するわけにはいきませんでした。 > > (b)でなく(a)なのは、 > 開発当初のパソコン(Windows95)は、メモリが16MBのパソコンが普通でしたので、 > メモリの有効活用のため、MIDIEvent構造体をなるべくコンパクトにしたかったためです。 > 現在においても消費メモリ量が少なくて済みます。 > > (c)を辞めているのは、 > MIDIEvent構造体のサイズがイベントの内容によらず固定長で、 > 内容変更では上層プログラマにポインタの指し直しを要求しないことも重視したためです。 > ポインタいじりはバグの温床となりますので、同じものを指している限り変わらないのが理想です。 > FILE* pFileの値がfopenからfcloseまでの間に変わってしまうと困るのと同じ意味です。 > > なお、上層プログラマから見て、常にm_lLenが正しいデータ長を表し、 > 常にm_pDataはデータのアドレスを指すようにすることで、 > 固定領域・malloc領域のどちらが使われているかは気にする必要がない(隠蔽されている) > ようにしてあります(バグがなければ)。 > > 時に、MIDIの特徴を考え、わたしのスタンス・感性でこのような方法を採用しましたが、 > 人によって別の手法を採用すると思いますし、 > 良いものが出来上がればそれぞれが正解だと思います。 > 今回ソースを読んでいただくことで、データ構造とアルゴリズムの話ができ、 > わたしも開発当初の気持ちを思い出すことができて、良かったと思います。
You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.)
Login
Nickname
Preview
Post
Cancel
Re: MIDIDataLib7.1のMIDIEvent構造体について (2023-02-20 08:23 by
usa3usa
#93982)
Reply
現状のMIDIDataLibの設計スタンスの解説ありがとうございます。
腑に落ちました!
私の感性は (c)上層のプログラマにMIDIEvent構造体へのポインタを正しく指し直すことを要求するが、多数発生する構造体のコンパクトさとmallocの使用回数減少を優先する
に近いようです。
想像するに、ほとんどのイベント長は固定で3バイト以内なので、イベント内容変更はMIDIEvent構造体のm_pData[]部の上書きで対応でき、ポインタ修正はほとんどの場合不要、本当に例外処理な気がしています。
細かい話ですが、
>LEN=0のメタイベントもありますので、0以外(例:-1)でマークする必要があるのと、
m_pData[]はランニングステータスをなくしたMIDIイベント
m_lLenはその長さ
のつもりなので、ノートオンならm_lLen=3、LEN=0のメタイベント なら m_lLen=1 になり、0になることはありません。
>今回ソースを読んでいただくことで、データ構造とアルゴリズムの話ができ、
>わたしも開発当初の気持ちを思い出すことができて、良かったと思います。
そのように言っていただき、安心しました。
今回は対応いただき、ありがとうございました。
Reply to
#93976
Reply to #93982
×
Subject
Body
Reply To Message #93982 > 現状のMIDIDataLibの設計スタンスの解説ありがとうございます。 > 腑に落ちました! > > 私の感性は (c)上層のプログラマにMIDIEvent構造体へのポインタを正しく指し直すことを要求するが、多数発生する構造体のコンパクトさとmallocの使用回数減少を優先する > に近いようです。 > > 想像するに、ほとんどのイベント長は固定で3バイト以内なので、イベント内容変更はMIDIEvent構造体のm_pData[]部の上書きで対応でき、ポインタ修正はほとんどの場合不要、本当に例外処理な気がしています。 > > 細かい話ですが、 > >LEN=0のメタイベントもありますので、0以外(例:-1)でマークする必要があるのと、 > m_pData[]はランニングステータスをなくしたMIDIイベント > m_lLenはその長さ > のつもりなので、ノートオンならm_lLen=3、LEN=0のメタイベント なら m_lLen=1 になり、0になることはありません。 > > > >今回ソースを読んでいただくことで、データ構造とアルゴリズムの話ができ、 > >わたしも開発当初の気持ちを思い出すことができて、良かったと思います。 > そのように言っていただき、安心しました。 > > 今回は対応いただき、ありがとうございました。
You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.)
Login
Nickname
Preview
Post
Cancel