RTTTL曲を再生する
ユーザーquartataがこのチャレンジを投稿しましたが、何らかの理由で自分のコンピューターでMIDIファイルを再生できないという事実を無視しました。 標準入力からRTTTL形式の曲を読み取り、曲名を標準出力に出力して(適切な速度とピッチで)再生する完全なプログラムを作成して、彼を助けましょう。 フォーマットの詳細 RTTTLは、かなり馬鹿げたもので、仕様が不十分な着信音フォーマットです。これは、名前、いくつかのデフォルト値、および単純なテキスト形式の一連のメモ(一度に1つのメモのみ)で構成されます。 例: fifth: d=4,o=5,b=63: 8P, 8G5, 8G5, 8G5, 2D#5 名前は、コロンで終了する文字列です。ここでの名前は「第五」です。プログラムは、15文字以上の名前を受け入れる必要があります。 次に、デフォルトセクション(コロンで終了)には、曲のデュレーション(d)、オクターブ(o)、および毎分ビート(b)のデフォルト値がいくつかリストされています。これらはカンマで区切られ、「key = value」構文を使用します。各「key = value」部分の周囲には、スペースをいくつでも含めることができます。デフォルト値d、o、bがこの順序ですべて存在すると想定できます。デュレーションとオクターブについては後で説明します。bpmは、1分間に再生する必要があるビートの数(4分音符に対応)を指し、20〜900の整数値(両端を含む)をサポートする必要があります。 次に、実際の曲は「DPO」構文を使用してコンマ区切りの一連のノートとしてリストされます。ここで、Dはデュレーション、Pはピッチ(ノート)、Oはオクターブです。各「DPO」パーツの周りには、スペースと改行がいくつあってもかまいません。 デュレーションは1から32までの2の累乗であり、これはノート全体の一部を表します。したがって、たとえば値4(4分音符)は値8(8分音符)の2倍になります。期間が欠落している可能性があります。その場合、デフォルトの期間が使用されます。持続時間は、ドット(.)の存在によっても変更できます。具体的には、ドットによってノートの持続時間が50%長くなります。ドットの位置について全員が同意するわけではないため、ピッチの後またはオクターブの後にドットを受け入れる必要があります(つまり、「DP.O」と「DPO。」の両方が機能するはずです)。 ピッチはA、B、C、D、E、F、G、A#、C#、D#、F#、G#、Pのいずれかです。AG#は標準の音符です(ノート:フラットなし、対応する鋭いノートを使用) Pは一時停止です。ピッチは必要なノートの唯一の部分であり、大文字と小文字は区別されません。 最後に、オクターブは通常4〜8の数値ですが、1〜8の任意の数値をサポートする必要があります。たとえば、C4は標準の中央のCで、周波数は約261.63Hzです。オクターブが欠落している可能性があります。その場合、デフォルトのオクターブが使用されます。一時停止にはオクターブが指定されていないと想定できます(意味がないため)。 他の課題で述べたように、このサイトを使用して、テストのためにRTTTL曲をMIDI形式に変換できます(ただし、まったく同じ仕様に準拠していない場合があります)。 要件: プログラムは、各ノートを適切な速度とピッチで再生する必要があります。可聴でピッチが認識できる限り、あらゆる種類の音(正弦波、三角波、方形波、ピアノ音、ベル音など、標準的なビープ音、波音、MIDI音など)を使用できます。 各ノートには、それよりも短い64分音符を超えない指定の期間連続して再生されない、またはしなければならないあなたのような何か使用している場合を除き、ADSRエンベロープのリリースフェーズは、次のポーズを介して、または次のノートの上に続けることができ、その場合には、 。 2つの連続する音符のピッチが同じである場合、短い休憩(最初の音符の継続時間の一部として64分音符の長さを使用しない)または不均一な音(このような音)を使用して、それらを明確に区別する必要があります。上記のADSRエンベロープとして)、または少なくとも十分変化している場合はフェーズ変更を介して。2つの連続した一時停止は、全体の継続時間を伴う単一の一時停止と同じように処理する必要があります。 プログラムは、無料で入手できるソフトウェアを使用して、Linuxで実行できる必要があります。標準入力から曲を読み取り、曲名を標準出力に出力します。 入力が上記の仕様と一致しない場合の動作は規定されていません。プログラムはエラーを無視したり、メッセージを出力したり、何かを再生したり、ハングしたり、クラッシュしたりする可能性があります。 標準の抜け穴は許可されていません。 得点 コードゴルフ、最短プログラム(UTF-8バイトで測定)が優勝します。