Advertisement
Guest User

Untitled

a guest
Oct 28th, 2012
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.05 KB | None | 0 0
  1. ご覧いただきましてありがとうございます。
  2.  
  3. >>662さん
  4. >transport->play()が無限ループの内側にあるのは書き間違い?
  5. >TSE3 0.3.1のサンプルを見ると外側にあるけど。
  6.  
  7. ご指摘頂いた通り、間違いでした。
  8. そして以下の様に修正しました。
  9.  
  10. timeBeginPeriod(1);
  11. transport->play(smf, startClock); // TSE3ライブラリ使用
  12. do
  13. {
  14. transport->poll(); // TSE3ライブラリ使用
  15. //Sleep(100); コメントアウト。色々調べたところ、ここでsleepしても意味が無いことが分かった。
  16. } while (true);
  17. timeEndPeriod(1);
  18. (ちなみに、
  19. https://bitbucket.org/jmb/tse3/src/689bf1f58264/src/tse3play/tse3play.cpp
  20. こちらのソースコードを参考にしています。)
  21.  
  22. そして、
  23. http://www.geocities.jp/kurogeki/page022.html
  24. 上記サイトから拝借したSMF(FF8のラスボスの曲)データを再生し、録音したものが以下になります。
  25. http://ux.getuploader.com/science1_20/download/169/20121029+002334.m4a
  26.  
  27. 音がブツブツ切れていますが、それっぽい音が一瞬鳴っています。
  28. が、全体も一瞬で終わってしまっています。
  29.  
  30. この後色々と調べたのですが、
  31. TSEライブラリのTransport.cppのpollPlayback()メソッドの中の
  32. _scheduler->tx(e);
  33. の下に
  34. Sleep(1);
  35. をかましてコンパイルしたもので、上記のSMFを再度再生すると
  36. 以下のような出力になりました。
  37. http://ux.getuploader.com/science1_20/download/170/20121029+002458.m4a
  38.  
  39. だいぶ本来の形に近づきました。
  40. しかしテンポがかなり早くなってしまっています。
  41. ですが、同時に鳴るべき音は全て同時に鳴っているように感じられます。
  42. テンポが一定ではなくたまに狂うのはsleep(1)というの固定値でsleep()させているからな気がするのですが、
  43. どういう問題が発生しているのかうっすら見えてきた感じです。
  44.  
  45. おそらくタイミングのコントロールは出来ているが異常な速さで曲が進んでしまうということは、
  46. 単純にテンポのコントロールがうまくいっていない、ということなのだと思います。
  47. 最初に上げたアップローダのURLの.m4aファイルで再生が一瞬で終わってしまっているのは
  48. 超高速なテンポで一気に再生してしまっているからなのではないかと思います。
  49.  
  50. というところまでは分かったのですが、ではなぜテンポが本来の速さではなく
  51. 超高速になってしまっているのかが分かりません・・
  52. アドバイス頂いたように簡単なSMFでのトレースを今しているのですが原因究明に至っていません。
  53. サンプルのコードを真似して
  54. PlayableIterator *pt = playable->iterator(0);
  55. startClock = (**pt).time;
  56. のような処理もいれているのですが、どうにも・・・。
  57.  
  58. 何度も恐縮なのですが、原因究明のための指針をいただけたら幸いです。
  59.  
  60. >>663さん
  61. >transport.play関数の役割を理解してる?
  62. あまり良く分かっていないのですが、サンプルコードや本体のコードを見た限りですと
  63. play()は再生開始時に一回だけ呼ぶ関数で、play()の中で後に呼び出される
  64. pollPlaybackが再生中に回り続けるループ関数なのかな、という印象です。
  65. http://tse3.sourceforge.net/doc/doxygen/classTSE3_1_1Transport.html#a21
  66. ここの説明も見ましたがちゃんと理解はできていません。
  67.  
  68. >transport.status関数をなぜ使わない?
  69. http://tse3.sourceforge.net/doc/doxygen/classTSE3_1_1Transport.html#w5
  70. ここのENUM値を返す感じの関数でしょうか。
  71. おそらく上記の通りテンポの管理に問題があると見当をつけたので
  72. Playing か Recording かというのはあまり関係ないのかなという風に
  73. 考え始めています。
  74.  
  75. 長文すみません。
  76. アドバイスいただけますと嬉しいです。
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement