言葉の音


11

あるものを別のものとして視覚化できるように、人々は多くのことを書いてきました。今、私は手紙を音楽に翻訳できることを提案します!テキストファイルを取り、各文字がからの特定のノートに変換されたサウンドファイルを出力するプログラムを作成するのがあなたの仕事C3-C8です。

免責事項-私は実際に音楽が良い音を出すことを期待していませんが、私は驚かれることを望んでいます。

仕様書

  • ファイルの名前を文字列として、BPM(1分あたりのビート)をintとして受け取ります
  • 大文字AをメモにするC3
  • そして、以下の順番ですべてのキャラクターを半歩上に移動します。 ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
  • はい、すべての文字が使用されるわけではありません。すべての文字がオクターブにまたがっているからです。
  • この方法でファイル内のすべての文字を翻訳します
  • 与えられたBPMで4分音符としてメモをまとめる
  • サウンドファイルとして保存するか(midiが最も簡単だと思いますが、何でも構いません)または再生します
  • 正常な入力形式であれば問題ありません
  • 標準的な抜け穴はありません
  • これはコードゴルフなので、バイト単位の最短コードが勝ちです!

ボーナス

  • 出力の転置を許可する-50バイト
  • 複数のファイルを取得することで、複数のトラックを互いに重ねることができます-75バイト
  • 連続した文字を1つの長いメモに結合する-50バイト

編集:うわー、負のスコアがあります。土曜日に勝者を発表します。


いつ勝者を決めるのですか?
LegionMammal978

入力にリストにない文字が含まれないと想定できますか?または、リストにないキャラクターに出会ったときはどうすればよいですか?
apsillers

@apsillers In The Snap 答え、彼は未定義の振る舞いを許可すると言った。
LegionMammal978

サンプルをアップロードしました。あなたはかなり正しかった、それは本当に良い音が聞こえない
...-Sanchises

回答:


6

MATLAB、159-50-50-75 = -16

サンプル入力

サンプル出力

非常にファンキーな純粋な正弦波を生成します(さらに良いスコアでのこぎり歯も可能ですが、それはちょっと... ファンキーすぎます)。関数として機能するため、['abc';'def']「トラック」ごとに1行の文字配列()が必要です。これは「任意の正常な入力形式」でカバーされていると思いますが、ファイルを読み取る必要があるという一般的なコンセンサスがある場合、それを変更できると思います。入力iは、(同じ長さの)テキストトラック、b1分あたりの拍数およびt転置(転置しない場合は0を指定)です。サイン入力をオフセットすることにより、2つのサインを1つにブレンドするため、3つのボーナスをすべて獲得し、負のスコアを獲得しました。

function v(i,b,t)
s=0;for r=1:size(i)
o=[];for k=i(r,:)
o=cat(2,o,sin(55*pi*2^((k-28+t)/12)*(numel(o)/2^13+(0:1/2^13:60/b))));end
s=s+o;end
sound(s/max(s))
end

入力ファイルを使用するバージョン:211-175 = 36

入力引数はi現在、ファイル名を表し、他のパラメーターは変更されていません。新しいリリースでは動作しないtextread可能性があります。これは、すぐに廃止される可能性がある警告が表示されるためです。編集:textreadは明らかに空白で自動的に分割されるので、それを修正しました。また、テスト中に発生した奇妙な音で誤ってエイリアンと接触した可能性があると思います。

function v(i,b,t)
i=textread(i,'%s','whitespace','','delimiter','\n');s=0;for r=1:size(i)
o=[];for k=i{r,:}
o=cat(2,o,sin(55*pi*2^((k-28+t)/12)*(numel(o)/2^13+(0:1/2^13:60/b))));end
s=s+o;end
sound(s/max(s))
end

どのバージョンがお好みですか?:)


まあ、仕様はファイルから入力を取得するように明示的に述べています...
LegionMammal978

@ LegionMammal978あなたが主張する場合:.matファイルは正常な入力形式です。テキストを含む 'i'変数を使用して.matファイルを作成します。次に、load(i);最上位バージョンの2行目の先頭に追加します。スコア:-16 + 8 = -8。あなたのコメントが私のコメントよりも多くの賛成票を得るとき、またはOPが意見を持っているとき、私はこれを行います:)
Sanchises

4

スナップ-401-75 = 326

こちらからオンラインでお試しください。

プログラムのバイト数をカウントするこの方法を使用しています。

ここに画像の説明を入力してください

複数のサウンドを一度に再生する機能を追加しました。

基本構造は元の構造と同じですが(下記を参照)、追加されていlaunch{}ます。launch{}内部のコードで新しいスレッドを開始し、同時実行を可能にします。

テキストとしてのコードは次のとおりです。

set[c v]to[ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
set[l v]to(list>
ask[BPM]and wait
set tempo to(answer)bpm
repeat until<(answer)=[
ask[notes]and wait
add(answer)to(l
end
delete(last v)of(l
for each(i)of(l
launch{
repeat(length of(i))(#
play note(i(c)(letter(#)of(i)))for(0.25)beats

(i(h)(n))
report(call(JavaScript function ([h][n]) {[return h.indexOf(n)+48]})with inputs(h)(n

元のコード、308。

ここに画像の説明を入力してください

ラッキースナップ!MIDIプレイが組み込まれています。;)

残念ながら、indexOf関数はないため、外部JavaScript呼び出しを行う必要がありますが、これはかなり高価です。

repeat () (#)ブロックは、反復ライブラリから来ています。

コードは次のようなテキストとして書き出すことができ、これが私が308バイトを取得する方法です:

set[c v]to[ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
ask[BPM]and wait
set tempo to(answer)bpm
ask[notes]and wait
repeat(length of(answer))(#)
play note(i(c)(letter(#)of(answer)))for(0.25)beats

(i(h)(n))
report(call(JavaScript function ([h][n]) {[return h.indexOf(n)+48]})with inputs(h)(n

SNAPには、スクラッチのようにこれらを追加できるコレクション/ショーケースがありますか?実行可能なバージョンに直接リンクすると便利なIMOになります。
ジオビット

はい。プロジェクトへのリンクを追加しました。良いアイデア。:)
Scimonster

-1から無視しindexOfますか?現時点では、文字列にない場合は、MIDI番号47のように見えます
。– Maltysen

@Maltysen質問は、適切な範囲外の入力に対して何をするかを決して述べません。
Scimonster

本当です。私はそれを無視するつもりでしたが、十分に具体的でないことのせいだと思うので、許可します。
マルティセン

4

Mathematica、219-50-75-50 = 44

c=CharacterRange;d=Import;EmitSound[Function[b,Sound[Split@Characters@d@b/.a:{__String}:>SoundNote[StringPosition[c["A","Z"]<>" ()-,;.'\""<>c["a","z"],a[[1]]][[1,1]]+#3-12,60Length@a/#2],{0,60StringLength@d@b/#2}]]/@#]&

入力ファイルのリスト、BPM、およびトランスポーズするハーフステップの数を入力として取得し、サウンドを再生します(ピアノから、他の楽器はより多くのバイトを必要とします)。


1

JavaScript(ES6)377-50-50-75 = 202

まず、<input>ファイル読み取りの代わりにフィールドを使用する実行可能なスニペットを次に示します。

<b>BMP:</b> <input id="bpm" size=3 placeholder="BMP" value="120"> <b>Transpose:</b> <input size=3 id="transpose" placeholder="Transpose" value="0"><br/><br/><div id="tracks" style="float:left;padding-right:5px;"><input placeholder="Track" class="track"></div><button id="add">Add Additional Track</button><div style="clear:both; padding-top:5px;"></div><button id="play"><b>Play</b></button><script>f=function(s,b,z){C=new (window.AudioContext||window.webkitAudioContext);b=6e4/b;s.map(function(p){var o=C.createOscillator(t=setTimeout);o.connect(C.destination);o.start();p.split("").map(function(c,i){t(function(){o.frequency.value=440*Math.pow(2, ("ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'\"abcdefghijklmnopqrstuvwxyz".indexOf(c)-21+z)/12)},b*i)});t(function(){o.stop()},p.length*b)})};document.getElementById("play").onclick=function(){f([].map.call(document.getElementsByClassName("track"),function(e){return e.value;}),+document.getElementById("bpm").value,+document.getElementById("transpose").value);};document.getElementById("add").onclick=function(){var i=document.createElement("input");i.placeholder="Track";i.className="track";document.getElementById("tracks").appendChild(document.createElement("br"));document.getElementById("tracks").appendChild(i);};</script>

そして今、実際のエントリ:

f=(n,b,z)=>{C=new AudioContext;b=6e4/b;s=n.map(m=>(x=new XMLHttpRequest,x.open("GET",m,0),x.send(),x.responseText));s.map(p=>{var o=C.createOscillator(t=setTimeout);o.connect(C.destination);o.start();[...p].map((c,i)=>t(_=>o.frequency.value=440*Math.pow(2,("ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'\"abcdefghijklmnopqrstuvwxyz".indexOf(c)-21+z)/12),b*i)),t(_=>o.stop(),p.length*b)})}

3つの引数は、同時に再生するファイルパス文字列の配列、1分あたりのノート、すべての入力をトランスポーズするハーフステップの数です。

空白とコメント付き:

f=(n,b,z)=>{
    C=new AudioContext;
    b=6e4/b;

    // fill s with the contents of each file
    s = n.map(m=>(x=new XMLHttpRequest,x.open("GET",m,0),x.send(),x.responseText));

    // play each track
    s.map(p=>{
        var o=C.createOscillator(t=setTimeout);
        o.connect(C.destination);
        o.start();

        // queue up each note with setTimeout
        [...p].map((c,i)=>
            t(_=>
                o.frequency.value=440*
                    Math.pow(2,
                            ("ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'\"abcdefghijklmnopqrstuvwxyz".indexOf(c)-21+z)/12
                    ),
             b*i)
        );
        // queue up termination of those track
        t(_=>o.stop(),p.length*b)})
}

f(["file:///home/users/apsillers/notes.txt",
   "file:///home/users/apsillers/notes2.txt"],
  240, 5)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.