片山博文MZの掲示板 34043


この掲示板について

1:片山博文MZ:

2011/03/24 (Thu) 15:30:40

片山博文MZが配布するソフト・プログラムなどに関する掲示板です。関係のない話題などは削除されます。また、禁止ワードが設定されています。適切にご利用ください。

ホームページはこちらです:
http://katahiromz.web.fc2.com/
48:書けるかな? :

2015/12/08 (Tue) 20:52:35

もし自分がやるんだったら
YM2203.hのdiff
92,93c92,93
< void set_pitch(int ch, int octave, int key);
< void set_volume(int ch, int volume);
---
> void set_pitch(int ch, int octave, int key, int adj = 0);
> void set_volume(int ch, int volume, int adj = 0);

YM2203.cppのdiff
93c93
< void YM2203::set_pitch(int ch, int octave, int key) {
---
> void YM2203::set_pitch(int ch, int octave, int key, int adj) {
99c99
< ((FM_PITCH_TABLE[key] >> 8) & 0x07)
---
> (((FM_PITCH_TABLE[key]+adj) >> 8) & 0x07)
103c103
< data = (uint8_t)FM_PITCH_TABLE[key];
---
> data = (uint8_t)(FM_PITCH_TABLE[key]+adj);
122c122
< void YM2203::set_volume(int ch, int volume) {
---
> void YM2203::set_volume(int ch, int volume, int adj) {
137c137
< uint8_t attenate = uint8_t(uint8_t(15 - volume) * 3);
---
> uint8_t attenate = uint8_t(uint8_t(15 - volume) * 3 - adj);

で、あとは soundplayer.cpp の127行目あたりで一度に ym.mix(&data[isample * 2], nsamples); ってやるんじゃなくて「引数adjの部分を少し変化させて ym.set_pitch か ym.set_volume を呼び出してから ym.mix」の繰り返しで合計nsamples分の ym.mix 呼び出しをする、という感じかなあ。この部分をどう作るかがポイント。
あ、set_pitchやset_volumeの中では上限や下限を超えないかどうかのチェックも必要かもしれない。

固定の割合で音程だけ変化させる専用のテスト版を作ってみたら
soundplayer.cppのdiff
127c127,142
< ym.mix(&data[isample * 2], nsamples);
---
> {
> int adj_p = 0; // for pitch
> // int adj_v = 0; // for volume
> int unit;
> while(nsamples) {
> unit = SAMPLERATE/300;
> if (unit > nsamples) unit = nsamples;
> ym.mix(&data[isample * 2], unit);
> isample += unit;
> if (note.m_key != -1) {
> adj_p--;
> ym.set_pitch(ch, note.m_octave, note.m_key, adj_p);
> }
> nsamples -= unit;
> }
> }
129d143
< isample += nsamples;

こんな感じか。
あるいは、unitは音色パラメータに依存しない数値にして、adj_pやadj_vをintではなくfloatにして管理したほうが楽かな。

  • 名前: E-mail(省略可):
  • 画像:

Copyright © 1999- FC2, inc All Rights Reserved.