カラオケのキー合わせをする 〜Laravelにのっけてみた〜 <途中>

[前回](http://qiita.com/banaba0207/items/cbacb5415f7546ee9ea4)pythonでカラオケのキー合わせをするプログラムを書きました。
今回、学習中のLaravelからこのプログラムを呼び出せるページをつくってみました。

といっても、PHPを書きなぐっただけなので、Laravelの機能はほぼ使えていません^^;

#やったこと
- PHPからpythonをコマンドラインで呼び出して、出力を取得した
- 自分の音域と歌いたい曲の音域をセレクトボックスで取得し、getで送信するようにした

#ソースコード
自分用の備忘録として。

- getで `$origkey`(自分の最高音)と`$adkey`（歌いたい曲の最高音）を取得している
- `exec`でローカル上でpythonを呼び出している
    - 出力結果は`$outpara`に格納される
- セレクトボックスは`<option>`タグに`selected`を追加することによって、初期値設定をすることができる
- pythonのプログラムは呼び出しを単純に行うために `public`以下に置いた
    - laravelの場合、ホームディレクトリ（という言い方が正しいのかはわからない）が`public`となるため
- pythonのプログラムの出力を以下の２つのみに絞った
    - `type` : １オクターブ上げや１オクターブ下や原曲ママ などの情報
    - `diff_key` : どのくらいキーを調節すればよいのか


```php.resources/views/karaoke/index.blade.php
@extends('layout')

@section('content')
    <h1>カラオケの音合せページ</h1>
<?php
if (!empty($_GET['origkey'])) {
    $origkey = $_GET['origkey'];
}else {
    $origkey = 'mid2G_s';
}
if (!empty($_GET['adkey'])) {
    $adkey = $_GET['adkey'];
}else {
    $adkey = 'hiA';
}

$oniki = ['lowF', 'lowF_s', 'lowG', 'lowG_s',
    'mid1A', 'mid1A_s', 'mid1B', 'mid1C', 'mid1C_s', 'mid1D', 'mid1D_s', 'mid1E', 'mid1F', 'mid1F_s', 'mid1G', 'mid1G_s',
    'mid2A', 'mid2A_s', 'mid2B', 'mid2C', 'mid2C_s', 'mid2D', 'mid2D_s', 'mid2E', 'mid2F', 'mid2F_s', 'mid2G', 'mid2G_s',
    'hiA', 'hiA_s', 'hiB', 'hiC', 'hiC_s', 'hiD', 'hiD_s', 'hiE', 'hiF', 'hiF_s', 'hiG', 'hiG_s',
    'hihiA', 'hihiA_s', 'hihiB'];

//フォーム作成開始
print("<table>");
print("<tr><td>");

//origkeyフォーム {{{
print("あなたの最高音");
print("<form method='get' action=''>");
print("<p>");
print("<select name='origkey'>");
foreach ($oniki as $oto) {
    if ($oto === $origkey)
        print("<option value='$oto' selected>$oto</option>");
    else 
        print("<option value='$oto'>$oto</option>");
}
print("</select>");
print("</p>");
//}}}

print("</td><td>　　</td><td>");

//adkeyフォーム {{{
print("歌いたい曲の最高音");
print("<p>");
print("<select name='adkey'>");
foreach ($oniki as $oto) {
    if ($oto === $adkey)
        print("<option value='$oto' selected>$oto</option>");
    else 
        print("<option value='$oto'>$oto</option>");
}
print("</select>");
print("</p>");
//}}}

print("</td><td>　　</td><td>");

//送信フォーム {{{
print("<p><input type='submit' value='調節する'></p>");
print("</form>");
//}}}

//フォーム作成終了 }}}

print("</td><td>　　</td><td>");
print("</td><td>音域の参考になるサイト : <a href='http://www.music-key.com/'>音域.com</a></td><td>");

print("</td></tr></table>");

print("<hr>");
$fullpath = "python karaokeForLaravel.py $origkey $adkey";
exec($fullpath, $outpara); //コマンドラインで $fullpathの内容を実行、出力結果を $outpataへ格納

$type     = $outpara[0];
$diff_key = $outpara[1];
print("あなたの最高音　　　: <font size='5' color='ff0000'>$origkey</font> <br>");
print("歌いたい曲の最高音　: <font size='5' color='ff0000'>$adkey</font> <br>");

print("<font size='6'>");
print("原曲キーから <font size='7' color='ff0000'>$diff_key</font> 調節");

switch($type){
case 'Original':
    print("すると、調度良く歌えます.");
    break;
case '1OctaveUp':
    print("して<font size='7' color='ff0000'>1オクターブ上</font>で歌えば、調度良く歌えます.");
    break;
case '1OctaveDown':
    print("して<font size='7' color='ff0000'>1オクターブ下</font>で歌えば、調度良く歌えます.");
    break;
}
print("</font>");
?>
@endsection
```

#結果
初期ページです。
![スクリーンショット 2016-03-05 3.13.43.png](https://qiita-image-store.s3.amazonaws.com/0/111756/25ef3636-45b7-3564-c7af-3edf7ab43d34.png)


セレクトボックスをいじって、'調節する'ボタンを押します。
更新されたページのURLを見ると、GETでパラメータが送信されていることが確認できます。
![スクリーンショット 2016-03-05 3.14.03.png](https://qiita-image-store.s3.amazonaws.com/0/111756/8c192fce-4e8c-4147-1ac7-3fa60ebb4975.png)


#改善点
- セレクトボックスがダサいので、bootstrapとか使いたい
- コードが汚すぎるので、リファクタリングする
- tableタグで横並びを実現しているのがダサすぎるので、修正する
- 音域情報を曲名やアーティストから探せるようにする
- VPSなどを借りて、公開できる状態にする

なにかプログラムミスや「こうした方がエレガントだよ！」等アドバイスがあれば、コメントにてお知らせくださいm(__)m