2014年10月31日金曜日

タンデム基板 手半田

タンデム基板の半田付けが完了した。今回は、amanero combo384とマスタ基板とスレーブ基板を上下に重なるようにした。

ところで、ファインメットビーズをマスタ基板に5個使っている。ファインメットビーズは、GNDとGNDを繋ぐ時にノイズ削減に大きな効果があるようだ。




タンデム マスタ基板(表)
*大失敗!音が出ないので調べていると、半導体計測屋さんからメールで、ジッタークリーナーを90°間違えて付けているとのこと。やってしまった。裏から熱を加えて慎重に外してみたが、ランドが4か所ほど剥がれてしまい復旧不可能な状態に。万事休す!今頃は素晴らしい音を奏でていたのにと思うと残念。魔が差したんですな、トホホ。

タンデム マスタ基盤(裏)

タンデム スレーブ基板(表)

タンデム スレーブ基板(表)

タンデム スレーブ基板(裏)

amanero combo384(表)

amanerto combo384(裏)

電源線とアナログ出力線




2014年10月29日水曜日

高周波半田ごて 手はんだに挑戦

これまでリフローしてもらったタンデム基板を使ってきたが、ようやく手はんだに挑戦した。


活躍したのは、テクニトロン・サプライで購入したMETCALの高周波半田ごてだ。まったくストレスなく半田が溶けるので、すべて一発・瞬時に半田付けができる。エミフルも笑ってしまうくらい簡単にできてしまう。フィルムコンも一瞬で付くので、もたもたして破壊する心配もない。
スイスイ進んで2晩で完了した。 ほんとうにありがたい。


2014年10月18日土曜日

32bit192kHzの衝撃!


RaspberryPi B + Volumio (32bit192kHzResampling I2S出力)   +  タンデム基板(DSD512出力)

恐ろしいほど解像度が高く、音の定位感が、上下左右は当然として、前後の定位感まで鮮明に感じるのである。

特筆すべきは、一音一音が強烈に太く力強いことだ。音にエネルギーが溢れ迸っている。余りに鮮烈。こんな音はかつて聴いたことがない。

これだけ定位感が凄いと、クラシックが聴いていて楽しくなる!これだけ音が太く強烈だと、ロックが気持ちよく復活する!

PC音楽ではどうしても音が濁ったり音が弱く細かったりで、今一つ楽しめなかったクラシック、ロックをまた聴いてみたいという気にしてくれる。

24bit192kHzとはまるで違う音。FN1242Aは32bit192kHzを入れても24bit192kHzにカットされてしまうのだと思っていたが、たとえカットされてもその効果はもの凄い。

一度聴いてみるべし!





まるで新譜のような新鮮さ。アナログレコードで初めて聴いた時の感動が蘇る。ついにPCオーディオがアナログを超えたかも。

2014年10月17日金曜日

Raspberry Pi I2S (8)

半導体計測屋さんが、RaspberyyPiからFSLED信号を出すスクリプトとタンデム基板の設定を公開された。ハードだけでなくLinuxのスクリプトまで書いてしまうとは!凄い!TypeBでもTypeB+でもOK。

441,96,192のリサンプリング設定読み込んで、NB3N2302の4倍8倍を自動切替してくれるので、一々タンデム基板の設定を変える必要がなくなる超便利スクリプトだ。なお、リサンプリング無しは441固定。441,96は4倍で22MHz、49MHz、192は4倍で49MHz。



SSHでvolumioにログインする
username : root
password : volumio


◆ How to install python

root@volumio:~# vi /etc/apt/sources.list
/wq


root@volumio:~# apt-get update
root@volumio:~# apt-get -y install python-rpi.gpio python-daemon


◆ How to install  start up daemon

root@volumio:~# vi /etc/rc.local
/wq


root@volumio:~# vi /home/volumio/mpc_FSLED.py

#!/usr/bin/python
#-*- coding: utf-8 -*-
u'''
http://www.rpiblog.com/2012/09/using-gpio-of-raspberry-pi-to-blink-led.html
https://github.com/if1live/rpi-mpd-controller
http://nw-electric.way-nifty.com/blog/2014/01/volumio-1ad0.html
http://zx900a.blogspot.jp/
'''

''' How to install python
    SSH login username:root password:volumio
/etc/apt/sources.list file OPEN and ADD this line
deb http://archive.raspberrypi.org/debian/ wheezy main
    type ther lines
sudo apt-get update
sudo apt-get -y install python-rpi.gpio python-daemon
'''
''' How to install  start up daemon
/etc/rc.local file OPEN and ADD this line befor "exit 0"
/usr/bin/python /home/volumio/mpc_FSLED.py

mpc_FSLED.py file place under /home/volumio
  type this line
chmod 777 mpc_FSLED.py
  type this line
reboot
'''
import RPi.GPIO as GPIO
import time
import commands
import re
from daemon import daemon
from daemon.pidlockfile import PIDLockFile

PIN_PREV_BTN = 15
PIN_PLAY_BTN = 10
PIN_NEXT_BTN = 8
PIN_STOP_BTN = 7
PIN_VOL_UP_BTN = 11
PIN_VOL_DW_BTN = 13

PIN_FS0 = 16
PIN_FS1 = 18
PIN_FS2 = 22


class Player(object):
    def __init__(self):
        self.re_play = re.compile(r'^\[playing\].+$')
        self.re_vol = re.compile(r'^volume:.+% .+$')
        self.play_state = self.is_playing()
        self.shutdown_timer = 0

    def sdtimer(self):
        if self.shutdown_timer is not 0:
            self.shutdown_timer -= 1

    def is_playing(self):
        result = commands.getstatusoutput('mpc')
        line_list = result[1].splitlines()

        playing = False
        for line in line_list:
            if self.re_play.match(line) is not None:
                playing = True

        self.play_state = playing

        for line in line_list:
            if self.re_vol.match(line) is None:
                self.vol_state = False
#                print '## vol False'
            else:
                self.vol_state = True
#                print '## vol True'

        return playing

    def play(self):
        if self.is_playing():
            retval = commands.getoutput('mpc pause')
            self.play_state = False
            print '#pause'
        else:
            retval = commands.getoutput('mpc play')
            self.play_state = True
            print '#play'
        print retval

#        result = commands.getstatusoutput('mpc')
#        line_list = retval[1].splitlines()
#        for line in line_list:
#            if self.re_vol.match(line) is None:
#                self.vol_state = False
#                print '### vol False'
#            else:
#                self.vol_state = True
#                print '### vol True'

    def prev(self):
        retval = commands.getoutput('mpc prev')
        print '#prev'
        print retval

    def next(self):
        retval = commands.getoutput('mpc next')
        print '#next'
        print retval

    def stop(self):
        if self.shutdown_timer is 0:
            self.shutdown_timer = 50
            retval = commands.getoutput('mpc stop')
            print '#stop'
            print retval
        else:
            retval = commands.getoutput('shutdown -h now')

    def volup(self):
        if self.vol_state is True:
            retval = commands.getoutput('mpc volume +2')
            print '#vol up'
            print retval

    def voldw(self):
        if self.vol_state is True:
            retval = commands.getoutput('mpc volume -2')
            print '#vol dw'
            print retval


class PlayerStatusFS(object):
    def update(self):
        allLines = open('/proc/asound/card0/pcm0p/sub0/hw_params').read()
        try:
          head, body = allLines.split('rate: ')
        except:
          head, body = "99","99"
        try:
          FsVal, tail = body.split(' (')
        except:
          FsVal = '99'
#        FsVal, BitVal, AnyVal =  Param.split(':')
        self.FsVal = int(FsVal)
#        print self.FsVal
#        if self.FsVal == 384000 :
#                 GPIO.output(PIN_FS0, GPIO.LOW)
#                 GPIO.output(PIN_FS1, GPIO.LOW)
#                 GPIO.output(PIN_FS2, GPIO.LOW)
#                 print self.FsVal
#                 print "384K"
#        else:
        if self.FsVal == 192000 :
                 GPIO.output(PIN_FS0, GPIO.LOW)
                 GPIO.output(PIN_FS1, GPIO.HIGH)
                 GPIO.output(PIN_FS2, GPIO.HIGH)
                 print self.FsVal
                 print "192K"
        else:
          if self.FsVal == 176400 :
                 GPIO.output(PIN_FS0, GPIO.HIGH)
                 GPIO.output(PIN_FS1, GPIO.LOW)
                 GPIO.output(PIN_FS2, GPIO.HIGH)
                 print self.FsVal
                 print "176.4K"
          else:
           if self.FsVal == 96000:
                 GPIO.output(PIN_FS0, GPIO.LOW)
                 GPIO.output(PIN_FS1, GPIO.LOW)
                 GPIO.output(PIN_FS2, GPIO.HIGH)
                 print self.FsVal
                 print "96K"
           else:
            if self.FsVal == 88200 :
                        GPIO.output(PIN_FS0, GPIO.HIGH)
                        GPIO.output(PIN_FS1, GPIO.HIGH)
                        GPIO.output(PIN_FS2, GPIO.LOW)
                        print self.FsVal
                        print "88.2K"
            else:
             if self.FsVal == 48000 :
                        GPIO.output(PIN_FS0, GPIO.LOW)
                        GPIO.output(PIN_FS1, GPIO.HIGH)
                        GPIO.output(PIN_FS2, GPIO.LOW)
                        print self.FsVal
                        print "48K"

             else:
              if self.FsVal == 44100:
                         GPIO.output(PIN_FS0, GPIO.HIGH)
                         GPIO.output(PIN_FS1, GPIO.LOW)
                         GPIO.output(PIN_FS2, GPIO.LOW)
                         print self.FsVal
                         print "44.1K"
              else:
                         print "NoChenged"

class Button(object):
    def __init__(self, pin, func):
        self.pin = pin
        self.old_state = 1
        self.func = func
        GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

    def update(self):
        curr_state = GPIO.input(self.pin)
        if self.old_state is 1 and curr_state is 0:
            self.func()
        self.old_state = curr_state

def main():
#    GPIO.cleanup()
    GPIO.setmode(GPIO.BOARD)
    GPIO.setwarnings(False)
    GPIO.setup(PIN_FS0, GPIO.OUT)
    GPIO.setup(PIN_FS1, GPIO.OUT)
    GPIO.setup(PIN_FS2, GPIO.OUT)

    player = Player()

    prev_btn = Button(PIN_PREV_BTN, lambda: player.prev())
    play_btn = Button(PIN_PLAY_BTN, lambda: player.play())
    next_btn = Button(PIN_NEXT_BTN, lambda: player.next())
 #   stop_btn = Button(PIN_STOP_BTN, lambda: player.stop())
 #   voldw_btn = Button(PIN_VOL_DW_BTN, lambda: player.voldw())
 #   volup_btn = Button(PIN_VOL_UP_BTN, lambda: player.volup())
    status_FS = PlayerStatusFS()


    while True:
        prev_btn.update()
        play_btn.update()
        next_btn.update()
#        stop_btn.update()
#        voldw_btn.update()
#        volup_btn.update()
        status_FS.update()
        player.sdtimer()
        time.sleep(0.5)

if __name__ == '__main__':
    with daemon.DaemonContext(pidfile=PIDLockFile('/var/run/mpc_FSLED.pid')):
        main()
        GPIO.cleanup()

/wq


root@volumio:~# chmod 777 /home/volumio/mpc_FSLED.py
root@volumio:~# reboot


◆ タンデム基板の設定

 NB3N2302 FS1 → MSTJP1の22へ

 MSTJP1 11-12、13-14ショート

 JCJP1  7-8、9-10、11-12、13-14ショート

 RaspberryPi GPIOの16,18,22 → JCCN1の14,16,18へ。

  *H26.11.4 赤字部分を追加修正




2014年10月15日水曜日

VOLUMIO

MAIN


Library


* 本来なら /etc/fstab で指定する楽曲の場所をここで指定できる
//192.168.11.3/music/pcm /music cifs username=papa,password=,uid=root,iocharset=utf8 0 0

* ただしUSBメモリが自動的にマウントされないので、/etc/fstab に以下を追加する。 /dev/sda1 は、 fdisk -l で確認のこと
 
 /dev/sda1 /mnt/USB vfat utf8 0 0 
  

Playback
* Audio Output で sendrpihifiberry を選択する        
* Resamplingはタンデム基板用の設定 32bit/192kHz

 Network

System

* Hifiberry を選び reboot

再生はvolumioからもできるが、使いなれたGMPCを使う

スマホから MPDroid で