エンジニアいちねんせい

「エンジニアはブログを書け」という先人の教えにならってブログをはじめてみたよ

Tkinterでドラクエ風の戦闘を作ってみたよ

どうもこんにちは〜。今回はpythontkinterドラクエっぽい戦闘画面を作ったよの回です。
最近はpythonをぼちぼち触ってまして、まぁ何か作ってみようかなということでtkinterを使ったGUIドラクエ1っぽい戦闘画面を作ってみました。
画面はこんな感じ。
f:id:barayosi:20190424134602p:plain
画面左側に表示されているキャラクター。これがりゅうおうです。かわいいね。
最初はトレスしようかと思ったんですが怒られが発生したら嫌だなと思って自分で描きました。ドラゴンじゃなくてムラサキ色のカンガルーなので完全に大丈夫です。
プレイヤーは通常攻撃の[たたかう]、ベキラマ相当の[まほう]、ベホイミ相当の回復、絶対に逃げられない[にげる]コマンドを駆使してりゅうおうを倒す趣向です。DQ1の死闘がここにミニマムな形で再現されていますよこれは。
りゅうおうは絶対に先制で激しいほのお、火の息、鋭いツメ(通常攻撃)をローテで使ってくるようになってます。

遊び方

コードは以下の通り。テキストにコピペして[りゅうおう.py]で保存して、画像素材を[りゅうおう.jpg]で保存して任意の場所に置いて、ソースコード内の画像ファイルのパスを修正したのちにコマンドプロンプトから[python3 りゅうおう.py]で実行すれば遊べるよ!
※事前にpython3を使えるようにしておき、追加でPILのインストールも必要です。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
import PIL

#勇者のステータス
hp = 138
mxhp = 138
mp = 123
power = 135
dif = 92

#敵のステータス
en_hp = 350
en_pow = 127
en_dif = 154
en_act = 0
dmg = 0

root = tk.Tk()
from PIL import Image, ImageTk

#りゅうおうの画像
img1 = ImageTk.PhotoImage(file="/Users/ユーザー名/Desktop/りゅうおう.jpg")#画像を置いたパスに書き換えてね
root.title("りゅうおう")
root.geometry("470x380")

#画像のキャンバス
canvas = tk.Canvas(root,width=230,height=280,bg="white")
canvas.place(x=0,y=0)
canvas.create_image(120,150,image=img1,tag="illust")

#ボタンのフレーム
buttonFrame= tk.Frame(width=150,bg="white")
buttonFrame.place(x=250,y=0)

#メッセージのフレームを入れるキャンバス
msgcanvas = tk.Canvas(root,width=250,height=200,bg="white")
msgcanvas.place(x=220,y=130)

#メッセージのフレーム
msgFrame = tk.Frame(msgcanvas)

#スクロールバー
bar= tk.Scrollbar(root,orient=tk.VERTICAL)
bar.pack(side=tk.RIGHT,fill=tk.Y)
bar.config(command=msgcanvas.yview)
msgcanvas.config(yscrollcommand=bar.set)
msgcanvas.config(scrollregion=(0,0,5000,5000))
msgcanvas.create_window((0,0),window=msgFrame,anchor=tk.NW,width=msgcanvas.cget('width'))

#勇者のステータス表示
def update_label(event):
    strings=("勇者(HP:"+ str(round(hp)) + "/MP:" + str(round(mp))+")")
    var.set(strings)
var = tk.StringVar()
var.set("勇者(HP:"+ str(hp) + "/MP:" + str(mp)+")")
status = tk.Label(buttonFrame, textvariable=var,bg="white")
status.pack()

#各種ボタンのイベント
def tatakau():
    global hp,mp,power,dif,en_hp,en_pow,en_dif,en_act,dmg
    ryuoh()
    if hp <= 0:
        pass
    elif en_hp < 0:
        pass
    else:
        dmg = (power/2)-(en_dif/4)
        en_hp = en_hp - dmg
        if hp > mxhp:
            hp = mxhp
        if hp <= 0:
            result=tk.Label(msgFrame,text="勇者は倒れた!")
            result.pack()
        elif en_hp < 0:
            result=tk.Label(msgFrame,text="りゅうおうを倒した!")
            result.pack()
        else:
            result=tk.Label(msgFrame,text="勇者の攻撃!")
            result.pack()
            result=tk.Label(msgFrame,text="りゅうおうに"+str(round(dmg))+"のダメージ!")
            result.pack()
    strings=("勇者(HP:"+ str(round(hp)) + "/MP:" + str(round(mp))+")")
    var.set(strings)

def mahou():
    ryuoh()
    global hp,mp,power,dif,en_hp,en_pow,en_dif,en_act,dmg
    if hp <= 0:
        pass
    elif en_hp < 0:
        pass
    elif mp < 15:
        result=tk.Label(msgFrame,text="勇者は雷の呪文を唱えた!")
        result.pack()
        result=tk.Label(msgFrame,text="しかしMPが足りない!")
        result.pack()
    else:
        if hp <= 0:
            result=tk.Label(msgFrame,text="勇者は倒れた!")
            result.pack()
        elif en_hp < 0:
            result=tk.Label(msgFrame,text="りゅうおうを倒した!")
            result.pack()
        else:
            mp = mp - 15
            dmg  = 60
            en_hp = en_hp - dmg
            if hp > mxhp:
                hp = mxhp
            if mp < 0:
                mp = 0
            result=tk.Label(msgFrame,text="勇者は雷の呪文を唱えた!")
            result.pack()
            result=tk.Label(msgFrame,text="りゅうおうに"+str(round(dmg))+"のダメージ!",)
            result.pack()
    strings=("勇者(HP:"+ str(round(hp)) + "/MP:" + str(round(mp))+")")
    var.set(strings)

def kaifuku():
    ryuoh()
    global hp,mp,power,dif,en_hp,en_pow,en_dif,en_act,dmg
    if hp <= 0:
        pass
    elif en_hp < 0:
        pass
    elif mp < 10:
        result=tk.Label(msgFrame,text="勇者は癒しの呪文を唱えた!")
        result.pack()
        result=tk.Label(msgFrame,text="しかしMPが足りない!")
        result.pack()
    else:
        hp = hp + 80
        mp = mp - 10
        if hp > mxhp:
            hp = mxhp
        result=tk.Label(msgFrame,text="勇者は癒しの呪文を唱えた!")
        result.pack()
        result=tk.Label(msgFrame,text="勇者のHPが80回復!")
        result.pack()
    strings=("勇者(HP:"+ str(round(hp)) + "/MP:" + str(round(mp))+")")
    var.set(strings)

def nigeru():
    global hp,mp,power,dif,en_hp,en_pow,en_dif,en_act,dmg
    if hp <= 0:
        result=tk.Label(msgFrame,text="勇者は倒れた!")
        result.pack()
    elif en_hp < 0:
        result=tk.Label(msgFrame,text="りゅうおうを倒した!")
        result.pack()
    else:
        result=tk.Label(msgFrame,text="勇者は逃げ出した!")
        result.pack()
        result=tk.Label(msgFrame,text="しかし回り込まれてしまった!",)
        result.pack()
    ryuoh()
    strings=("勇者(HP:"+ str(round(hp)) + "/MP:" + str(round(mp))+")")
    var.set(strings)

#りゅうおうの行動
def ryuoh():
    global hp,mp,power,dif,en_hp,en_pow,en_dif,en_act,dmg
    if hp <= 0:
        result=tk.Label(msgFrame,text="勇者は倒れた!")
        result.pack()
    elif en_hp < 0:
        result=tk.Label(msgFrame,text="りゅうおうを倒した!")
        result.pack()
    elif en_act == 0:
        #激しいほのお(中ダメージ)
        dmg = 40
        hp = hp - dmg
        if hp <= 0:
            hp = 0
        en_act=en_act +1
        result=tk.Label(msgFrame,text="りゅうおうは激しい炎を吐いた!")
        result.pack()
        result=tk.Label(msgFrame,text="勇者に"+str(dmg)+"のダメージ!")
        result.pack()
    elif en_act == 1:
        #火の息(小ダメージ)
        dmg = 20
        hp = hp - dmg
        if hp <= 0:
            hp = 0
        en_act=en_act +1
        result=tk.Label(msgFrame,text="りゅうおうは火の息を吐いた!")
        result.pack()
        result=tk.Label(msgFrame,text="勇者に"+str(dmg)+"のダメージ!")
        result.pack()
    else:
        #鋭いツメ(通常攻撃・大ダメージ)
        dmg = (en_pow/2)-(dif/4)
        hp = hp - dmg
        if hp <= 0:
            hp = 0
        en_act = 0
        result=tk.Label(msgFrame,text="りゅうおうは鋭いツメで切りつけてきた!")
        result.pack()
        result=tk.Label(msgFrame,text="勇者に"+str(round(dmg))+"のダメージ!")
        result.pack()

#初期メッセージ
start = tk.Label(msgFrame,text="りゅうおうが現れた!")
start.pack()

#ボタン配置
Button1 = tk.Button(buttonFrame,text="たたかう",width=10,command=tatakau)
Button1.pack()
Button2 = tk.Button(buttonFrame,text="まほう",width=10,command=mahou)
Button2.pack()
Button3 = tk.Button(buttonFrame,text="かいふく",width=10,command=kaifuku)
Button3.pack()
Button4 = tk.Button(buttonFrame,text="にげる",width=10,command=nigeru)
Button4.pack()

root.mainloop()</span>

f:id:barayosi:20190424135041j:plain
りゅうおう.jpgで保存してね

かいせつ

はい。とりあえず中身の解説をしますと勇者とりゅうおうのステータスを定義した後にTkinterでフレームとボタンを配置して、PILで画像表示して、メッセージ用フレームをスクロールさせるスクロールバーを配置して、各コマンドのボタンを押した時の戦闘処理とメッセージをdefで書いて終わり!って感じです。
ダメージ処理はだいたい固定値なんですが[たたかう]だけはドラクエ風に攻撃/2-守備/4にしてるのが小さなこだわり。
あとは勝利or敗北時のメッセージを複数箇所に書いちゃってやたら行数が増えているのがチャームポイントですね。絶対もっといい書き方あるでしょ。。と思いつつまぁ動くし別にいいやということで完成させました。
また、勝利or敗北後に[にげる]ボタンを押すと勝利/敗北のメッセージが2回流れる不具合もあります。(直すのが面倒だった)

そんな感じでtkinterドラクエ風の戦闘作ったよの回でした。とりあえず動くもの作ってみよう、っていうのは勉強になりますね〜。次はDjangoで似たようなの作りたいかもしれない。
それではまた!シーユーネクスト!

Ansible触ってみた(初期設定からansible-playbook実行まで)

参考書片手にAnsibleを触ってみたので備忘録を書きます。参考にしたのはこの本です。

book.impress.co.jp

 Ansibleとは?

Ansibleはこの頃はやりの構成管理ツール。サーバの初期設定とか運用時の自動化が捗るらしいです。特徴としてはターゲットノード(管理される側)はPythonが導入されていれば特別な設定が不要なので手軽であること、設定ファイルの書式(YAML)の可読性が高く非プログラマでも管理が容易であることが挙げられるようです。
また、Ansibleにおいては冪等性(べきとうせい)の担保が重要なキーワードの様子。冪等性は何度実行しても同じ結果を得ること。Ansibleの設定を変更しない限り、何度実行しても同じ状態を保つようにすることが重要で、冪等性のないものはAnsibleで行うべきではない、という感じ。なるほど。。(腹に落ちてない感) 

さて、今回使用する環境はこんな感じです。
・コントロールノード(管理する側):MACを使用
・ターゲットノード(管理される側):Linux(Raspbian)
両方とも同一ネットワークに接続、事前にMAC側で事前に公開鍵を作ってます。公開鍵認証は前回の記事に書いたのでそちらを参考にしていただければ。

Ansibleの導入(MAC)

まずコントロールノード側にAnsibleを導入します。
$brew update
$brew install ansible
Homebrewからansibleをインストール。

$touch $HOME/.ansible.cfg
Ansibleの設定ファイル作成。設定をここに書き足したり足さなかったり。/etc/ansible/ansible/cfgとかでも可だけどユーザーごとに設定変えたい時もあるだろうということでホームディレクトリに作成が良いらしい。

Ansible用ユーザー作成・公開鍵認証

$sudo useradd -m ansible
$sudo passwd ansible
$mkdir /home/ansible/.ssh
$touch /home/ansible/.ssh/authorized_keys

次はLinux側でAnsible用のユーザーを作成していきます。今回の環境(Raspbian)はデフォルトでPythonが入っているので初期設定は管理ユーザー作るくらい。

$ssh-copy-id  -i $HOME/.ssh/id_rsa.pub ansible@XXX.XXX.XXX.XX
そしてMAC側で上のコマンドを実行して公開鍵を渡す。前回のとは違う受け渡し方にしてます。直接authorized_keysに追加してくれるのでこっちのが楽ですね。
※この時はパスワード認証をオンにしておく。permission deniedする時は鍵を作り直して試す、authorized_keysのパーミッションを確認して一時的に666にしちゃう、とか実施。

$sudo chmod 700 /home/ansible/.ssh
$sudo chmod 600 /home/ansible/.ssh/authorized_keys
.sshとauthorized_keysのパーミッションを修正して

$ssh ansible@XXX.XXX.XXX.XX
MAC側でパスワード聞かれずにSSH接続できたらOK.これで下準備は完了!

インベントリの作成

Ansibleの参照ファイルその1、対象を指定する方のファイル(インベントリ)を作成します。
touch $HOME/test_inventory.ini
中身は以下の書式でグループ名とIPアドレスを記載。シンプル。

[servers]
XXX.XXX.XXX.XX

プレイブックの作成

ファイルその2、実行内容を記載する方のファイル(プレイブック)です。
touch $HOME/test_playbook.yml
中身はこれを記載。ansibleのホームディレクトリにtestファイルを作成する内容。

- hosts: servers
  user: ansible
  tasks:
  - name: test
    file:
       path: /home/ansible/test
       state: touch
       owner: ansible
       mode: 0777

Ansible-playbookの実行

前段で作成した2つのファイルを参照してansible-playbookコマンドを実行していきます。
$ansible-playbook -i $HOME/test_inventory.ini $HOME/test.yml --check

まずは--checkオプションを入れてチェック。構文エラーとかが出たら修正。問題なければ続行。
$ansible-playbook -i $HOME/test_inventory.ini $HOME/test.yml
--checkなしで実行。これでエラーが発生しなければファイルが作成されます。 

おわりに

本当に触りだけですがとりあえず動かしてみました。これだけだと正直でっていうなのでもうちょい触って自動化っぽいとこまでやってみたいなぁ。

MACとLinux間でのSSH公開鍵認証の設定

MACLinux(ラズパイ)のSSH接続を公開鍵認証に変えたので備忘録として書いときます。ユーザー名とかアドレスとか環境によって変わるとこはXXXにしてます。何かの参考にするときは適宜読み替えて!

Mac側での設定

$mkdir /Users/XXX/.ssh
まずホームディレクトリに.sshフォルダを作成。MACだと/homeじゃなくて/Usersなので気をつけて~

$ssh-keygen -t rsa
表示に従ってEnter,Enter,Enterで鍵作成。
(/Users/XXX/.sshパスフレーズなしで鍵作成)

秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が作成されます。.pubは多分パブリックの意。ファイル名似てるけど取り違えるとえらいことになるので注意。

$chmod 700 /Users/XXX/.ssh
$chmod 600 /Users/XXX/.ssh/id_rsa
パーミッション変更。セキュリティ的に設定変更すべきだし、変更しないと繋がらないこともあるっぽい

$scp /Users/XXX/.ssh/id_rsa.pub pi@XXX.XXX.XXX.XX:/home/XXX/.ssh
*SCPはSSH接続でファイル転送するのでこの時点ではLinuxのパスワード認証の許可は残しておく

Linux側での設定

$mkdir /home/XXX/.ssh
$touch authorized_keys /home/XXX/.ssh/
*ホームディレクトリ直下の,sshディレクトリはSCPでファイル転送する前に作っておく

$cat /home/XXX/.ssh/id_rsa.pub >> /home/XXX/.ssh/id_rsa.pub
authorized_keysに送ってきた公開鍵の情報を追加。

$chmod 700 /home/XXX/.ssh
$chmod 600 /home/XXX/.ssh/authorized_keys
パーミッションの設定。MAC側と同じく。 

SSHの設定変更
$cd /etc/ssh
$sudo cp sshd_config sshd_config.bk
まずsshd_config(設定ファイル)のバックアップを作っておく。

$sudo vi /etc/ssh/sshd_config
設定ファイルを書き換え。(行数は僕の環境での行なので参考程度にしてね!だいたいそんくらいの位置なんだなくらいで)

PubkeyAutentication yes  (37行目)
AuthorizedKeysFIle        .ssh/authorized_keys(40行目)
PasswordAuthentication no(58行目)
PermitEnptyPasswords no(60行目)
ChallengeResponseAutentication no(64行目)
UsePAM no(87行目)

公開鍵認証を使うし、authorized_keysは.ssh/authorized_keysを読みに行くし、パスワード認証はしないし、パスワードなしなんて認めないし、チャレンジレスポンス認証もPAMも認めないよという設定。変更が終わったら保存して再起動。

そしてMAC側でSSH接続を行えば繋がる!はず!はずなんだけど僕は一回ここでPermission denied(publickey)というエラーが出ました。

ググると以下が原因である様子。
1.間違った鍵で接続しようとしている
2.ユーザー名やホスト名が間違ってる

鍵は作りたてホヤホヤだから間違ってないけど、そういえば鍵作った後にMACのホスト名変えたんですけどそれが原因だったりするんですか??(多分そう)
鍵を作り直して登録後、再度試したら繋がりました。不用意にホスト名を変えるのはやめよう。。

という感じで公開鍵認証の設定でした。いえーい。

RaspberriPiケース自作の回(原価100円)

今回はラズパイのケース自作しましたの回です。
元々は純正ケース使ってたんですけどDACつけたら入らなくなっちゃったんでこういうケースを作ったよ、というアレです。

はいドン!

f:id:barayosi:20190306000036j:plain

100円ショップ(セリア)で買ってきたちょうどいい大きさの箱にざっくりと印をつけまして

 

f:id:barayosi:20190306000558j:plain

穴を開けてな、穴を開けてな


カッターで穴を開けて行きました。

f:id:barayosi:20190306000806j:plain

切った時のバリは水でなめしたりしてます。


そして完成したのがこちら!

f:id:barayosi:20190306001031j:plain

ごろり

f:id:barayosi:20190306001508j:plain

パカリ

所要時間1時間(思いのほか紙が硬かった)で完成しました。
すごくおしゃれ!って感じではないですけど自分で作った愛着もあり結構気に入ってます。ステッカーとか貼ろうかなぁ

VolumioでDACの動作確認

これまでのあらすじ

ラズパイにDACを積んだものの認識しなかったので、動作検証をするために設定が簡単なVolumioで動作確認をするよ。

というわけでVolumioの設定をしていきます!サクサクと!

 

Volumioのダウンロード

まずは公式サイトからVolumioをダウンロードします。
https://volumio.org

 

SDカードをフォーマット

Volumioを入れるMicroSDカードをフォーマットします。Windows標準のフォーマットだと相性問題で書き込みに失敗することがあるらしく。ツールを使います。
https://www.sdcard.org/jp/downloads/formatter_4/

 

SDカードに書き込み

フォーマットが終わったらmicroSDカードに書き込み。ツールはこれを使用。
http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows

書き込む時の注意なんですが、PC本体のスリープ設定を無効にしておかないと途中でスリープして失敗するかも。というかしました。書き込みに失敗したSDカードには中途半端なデータとパーティションが残り、フォーマットにも失敗する廃棄物になってしまったのでくれぐれも気をつけて。。 

Volumioの起動

書き込みが完了したらラズパイに挿して起動。デフォルトのユーザー名はvolumioでPWもvolumio。でログイン。

ログインしたら同一ネットワークに繋がっているPCから初期設定をします。同一ネットワークのPCのブラウザで「http://volumio.local/」にアクセス、なんですがここで詰まりました。

通常の手順ならラズパイを有線でネットに繋いで、同一ネットワークのPCのブラウザでを開けばいいんですけど、うちにはポケットWIFIしかないぞという。。この段階ではWIFIの設定もできないしどうすればいいんだ。。。と。

結論からいうと、ポケットWifiをラズパイにUSB接続することで解決しました。よかった。

その後はPCからGUIで設定をしていけば簡単にDACも認識します。認識しなければ初期不良ないし接触不良か何か!

僕の場合はVolumioでもDACを認識せず、やはり初期不良か、、こいつめ、、とDACを触った時にDAC本体のランプが点灯して接触不良に気づいたのでした。

 

はい。そんな感じでサクッとVolumioで動作確認の回でした。
次回はラズパイのケース自作の回ですぜ。

クソ音質のRaspberryPiにDACという光を

 [これまでのあらすじ]
遊ばせていたRaspberryPiをオーディオプレイヤーにしようと設定を行なったものの肝心の音質が糞だったよ。

はい。というわけで今回はラズパイの音質をなんとかするべくDACの設定をしたよ、なやつです。音質を改善したくてググるDACなるものがあるらしいので試してみました。 

DACとは?

そもそもDACとは何か。Google先生によるとD/Aコンバーターの略でデジタル信号をアナログ信号に変換する機器らしいです。ふむふむ。

あとはDACについて説明するこんな記事が出てきたけどちょっとよく分からないですね。。えっこれオーディオ沼によくある似非科学のオカルト機器なのでは???疑いつつ進めていきます。

DACの調達

さてDACですが、AmazonでRaspberryPi用のDACを探すといくつか出てきたうち、これを購入してみました。

https://www.amazon.co.jp/gp/product/B01HCL6GFC/ref=ox_sc_act_title_1?smid=A3F6I5H5DTXS3W&psc=1

KumanのSC08。レビュー件数もぼちぼちあるし、値段も3000円程度とお手頃だったので選定。プラス1000円でケース付きのもあったんですがケースの出来がイマイチらしいので除外しました。
品名にサウンドカードモジュールとありますが、サウンドカードって言われるとなんとなく納得できる感じしますね。ビデオカードとかあるし、それのオーディオ版みたいなもんなんだろうな?みたいな。 

ラズパイへの取り付け

早速取り付けていきますよ。Pi3本体から生えているGPIOピンにDACを差してネジ止めして完了!!大きさはPi3に合わせてあるので取り付け方法に迷うことないと思います。
ネジ止めは地味に面倒臭く、横着して素手で組み立てたらまあまあ時間がかかりました。ナットがポロポロしてストレスを溜めたくない方はマイナスドライバーと六角ナットを回せる工具を用意するのをおすすめします。

GPIOピンに何か取り付けるのこれが初めてだったので、どこまで挿していいのかは結構悩みました。力入れたらもうちょい挿せる気がするけど、抜けなくなったりピンが折れたりしそうで。
ぼくは最初、挿し方が甘いのが原因でDACを認識せずに嵌ったので気持ちしっかりめに挿した方がいいかも?がっつり挿そう!!(自己責任で)

そしてこの時点で純正ケースにラズパイが入らなくなります。基盤むき出しだと無防備感がすごくて不安になるので、ケース付きを購入しなかったことを少し後悔しました。ケース付きを購入するか、もしくは間に合わせでもいいのでこの時点で代わりのケースを用意しておくとよいかなと思います。

最終的には下記画像の状態になってます。

f:id:barayosi:20190225233105j:plain

けっこう傾いてるんですがこれで正解なのか、

f:id:barayosi:20190225233134j:plain

ピン側から撮った画像。もっと押し込んでいいのかどうなのか。

DACに通電していると赤ランプが点灯、Pi本体がDACを認識していると緑ランプが点灯するようなので、Pi本体の電源を入れてなんのランプも点かないようなら接続不良か初期不良を疑った方がよいですね。

f:id:barayosi:20190225233601j:plain

まばゆい緑ランプ

RaspberryPi側の設定(Raspbianの場合)

RaspbianではそのままではDACを認識しないのでこんな感じで設定します。

$sudo vi /boot/config.txt 
[config.txt内に以下を追加]
dtoverlay=hifiberry-dacplus

$sudo vi /etc/modules
 [modules内に以下を追加]
snd_soc_hifiberry_dacplus

※設定はこのサイトを参考にしました。
そしてAmazonにhifiberry-dacplusで動いたよ、というレビューがあったのでhifiberry-dacplusで設定。先人の知恵、ありがたや。

設定後に再起動。うまくいけばは緑ランプが眩く点灯するはず!
そしてGUIで設定>Audio Device Settingsを選択してデフォルトの他に「snd_rpi_hifiberry_dacplus」が増えていれば成功!Make Defaultを選択してデフォルトに設定します。これでラズパイ側の設定も完了! 

Audaciousの設定

以下はAudaciousで僕がしている設定です。参考程度に。。

Audaciousの設定>出力プラグインALSA出力>ミキサーデバイス:sysdefault
ビット深度:32
バッファーサイズ:6000
Audaciousの設定>プラグイン>インプット [FFmpegプラグイン]のみにチェックを入れて他は全部外す

この設定でまあ音質は問題ないかな?という感じになってます。ビット深度は16からハイレゾ相当の32にすると結構変わりますね。クリアになるような。
バッファーサイズは変えても正直全然違いが分からないのですが、とりあえず上げとくか…上限10000みたいだからこんくらいあればいいでしょ…と6000に。適正値が知りたい。
インプットはFFmpegで全部再生できるから他いらないよね?と思って他のをオフにしました。

デフォルトとDACありで音質の違いを試してみたよ。

DACなしのデフォルトとDACありで実際どのくらい音質が変わるのか気になったので試してみました。
プレイヤーはAudaciousで、出力プラグインは両方とも同じALSA出力、ビット深度は32で、、と思ったらデフォルトだと16bitまでしか対応してないようで、ビット深度32だと音楽の再生ができませんでした。なるほどここで音質の違いが出てきそうですね。
というわけで、DACなし(ALSA、ビット深度16)とDACあり(ALSA、ビット深度32)で聴き比べました。

まず印象的なのはボリュームの違いで、DACありの方がボリュームがだいぶ大きくなりますね。これってこういうものなんですかね。音質はというと、まぁまぁ音質良くなったな?なんだか音圧が上がったかな?程度でDACの勝ちですね。というかデフォルトでもまぁまぁ聴ける。聴けちゃった。
DAC導入を決意させた時のえげつない音割れはなんだったんだ。やっぱり聞いた時のAudaciousの設定がまずかったのか。

…というわけで結論としてはまぁ3000円なら試してもいいんじゃない、僕は音質上がったと思いましたよ、、という感じですね。(もやっとした結論)  

おわりに

はい。…という感じでこれで設定手順の本筋は完了なんですが、実際はDACを認識せず、初期不良を疑ったんですよね。(結局接続不良だったんですが)
設定がまずいのかDAC初期不良なのか、問題の切り分けをするためにDACの設定が簡単らしいオーディオ用ディストリビューションのVolumioで動作検証をすることにしました。Volumioでも認識しないようならこれは初期不良だぞと。
そんなわけで次回はVolumioをインストールしてDACの動作検証の巻です(予定)。よろしくお願いします。

RaspberryPiをスマホから操作しよう(AndroidからVNC接続)

はい、今回はラズパイとAndroidVNCでの接続です。

環境はraspbianでの設定ですよ。飽きてきたのでサクサクいくぞ!

 

RaspberryPiの設定

まずRaspberryPiの設定です。

GUIでRaspberryPiの設定>インターフェイスVNC を有効にします。

 

昨今のRaspbianではVNCサーバーのRealVNCがデフォルトで入っているためこの手順でRealVNC自動起動してくれます。

でもそのままだと繋がらなかったりするようなので設定を変更します。

 

右上に出てきたRealVNCのアイコンを右クリックしてOptions>Securityを選択

AutenticationをVNC Passwordに変更してOK,パスワードを設定して完了です。

 

ここを参考にしました。

https://a244.hateblo.jp/entry/2016/10/10/003248

 

最初はRealVNCが入っていることに気づかずx11vncでの自動起動とか設定してました。ググるとやたらx11vncでの設定方法が出てくるんですよね。。

x11vncだとRealVNCよりカクつくしすごく遠回りしてしまった。

 

Androidの設定

次はAndroid側。VNC Viewer - Remote Desktopをインストールして

 

IPアドレス:5900(ポート番号)

 

これで設定してパスワードを入れて接続!Androidでラズパイのデスクトップが見える!操作できるやったー!

繋がらなければRealVNCのOptions>Connectionsでポート番号の設定とか変えてみると良いかもです。

 

はい。これでAndroidからラズパイのデスクトップを操作できるようになりました。

これにて音楽ファイルがじゃんじゃか入ったHDDを繋いだラズパイにスピーカーを繋ぎ、それをAndroidで遠隔で操作してお部屋のどこでも手持ちの音楽資産を活用できるオーディオ環境が完成したんですが、いざ聞くとまぁ〜クソ音質だったんですよね。。

 

ということで次回は音質をなんとかするためにDACなるものを導入したよ編です。よろしくお願いします。