2012年4月21日土曜日

JRiver Media Center DoP対応

 PCで音楽さんの記事でJRiver Media Centerがv 17.0.106  DoPに対応したことが紹介されています。
半月ぐらい前に試したときは未だ対応しておらず、そのままチェックしていませんでしたが、その後対応していたようです、
 v17.0.122をダウンロードしてインストール。今までライセンス未購入でしたが、特に問題なければ、メインで使用するつもりで購入してみました。

 JRiver Media Center

 DoPで使用するには、下記の設定を合わせればOK。
 DoPモードは見つけにくいところにあり ビデオ-bitstreaming にチェックボックスがあります。
 また、ASIOで試してみましたがダメでWASAPI-Event Styleでしかうまくいっていません。

 ビデオ-bitstreaming カスタムを選択し、DSD over PCM(DoP) をチェック
 DoP Format:使用機器に合わせてDoPかdCSを選択

 オーディオ-出力モード:WASAPI-Event Styleを選択
 出力モード選択で使用するデバイスを選択

2012年4月19日木曜日

Thunderbolt光ケーブル

住友電気工業がThunderbolt光ケーブルのサンプル出荷を開始したとのこと。
最大伝送距離は20mとのこと。意外と短いですね。

ケーブルコネクタ内に電気⇔光変換機能を実装し、コネクタは通常のメタルケーブルと同じで Thunderboltポートに挿せば使えるようになっています。

 下のBelkin のThunderbolt Express DockなどのThunderbolt⇔USB変換機能を持つ装置があれば、USB DDC/DACとPCの電源を完全にアイソレートすることが可能になるはずです。

  Belkin  Thunderbolt Express Dockは$299と少々お高いですが、だんだんとバリエーションも増え、価格もこなれてくるとを期待したいところです。
 光ケーブルの方は価格が不明ですが、それなりに高価になると思います。 
 Thunderboltポートを持つApollo High-Resolution Interfaceや、Apogee Symphony I/O 

Symphony 64 | ThunderBridgeなどのAudioIFもありますがやはり高価です。


 Thunderbolt光ケーブル(住友電気工業


 Belkin  Thunderbolt Express Dock 

2012年4月16日月曜日

QuartusII システムコンソール Dashboard 2

DashboardのGUIからFPGA内のレジスタアクセスする例として、I2Cコントローラのレジスタを周期モニタしてDashboardに表示させることと、Dashboardの設定用Textboxから設定する機能を作りこんでみました。

 システムコンソール Dashboard I2Cレジスタモニタ、設定画面



 "Start Mon"プッシュでレジスタを周期的に読みDashboardに表示し、TextBoxに設定値を書いて、setを押すとレジスタの内容が書きかえます。
 細かい調整や画面デザインなどはこれから。

 下記が該当部のtcl記述になります。

proc count_g3 {group_name} {

variable dash

variable prescale_val
variable control_val
variable status_val
variable transmit_val
variable receive_val
variable command_val
variable timer_val

#  reg read and display

set i2c_baseadd 0x00000000

set i2c_prescale       [format "0x%08x" [expr $i2c_baseadd + 0x0 ] ] 
set i2c_ctrl         [format "0x%08x" [expr $i2c_baseadd + 0x4 ] ] 
set i2c_status       [format "0x%08x" [expr $i2c_baseadd + 0x8 ] ] 
set i2c_transmit     [format "0x%08x" [expr $i2c_baseadd + 0xc ] ] 
set i2c_receive       [format "0x%08x" [expr $i2c_baseadd + 0x10 ] ] 
set i2c_command       [format "0x%08x" [expr $i2c_baseadd + 0x14 ] ]
set i2c_timer       [format "0x%08x" [expr $i2c_baseadd + 0x40 ] ]

   set mast [lindex [get_service_paths master] 0]
   open_service master $mast
   # prescale
   set prescale_val [master_read_32 $mast $i2c_prescale 1]  
   dashboard_set_property $dash $group_name.prer_val text [format "0x%04x" [expr ($prescale_val)] ]
   # ctrl
   set control_val [master_read_32 $mast $i2c_ctrl 1]  
   dashboard_set_property $dash $group_name.ctrl_val text [format "0x%04x" [expr ($control_val)] ]
   # status 
   set status_val [master_read_32 $mast $i2c_status 1]  
   dashboard_set_property $dash $group_name.status_val text [format "0x%04x" [expr ($status_val)] ]
   # transmit
   set transmit_val [master_read_32 $mast $i2c_transmit 1]  
   dashboard_set_property $dash $group_name.transmit_val text [format "0x%04x" [expr ($transmit_val)] ]
   # receive
   set receive_val [master_read_32 $mast $i2c_receive 1]  
   dashboard_set_property $dash $group_name.receive_val text [format "0x%04x" [expr ($receive_val)] ]
   # command
   set command_val [master_read_32 $mast $i2c_command 1]  
   dashboard_set_property $dash $group_name.command_val text [format "0x%04x" [expr ($command_val)] ]
   # timer
   set timer_val [master_read_32 $mast $i2c_timer 1]  
   dashboard_set_property $dash $group_name.timer_val text [format "0x%04x" [expr ($timer_val)] ]
   
   after 1000 i2c_Control::count_g3 $group_name
 }

 proc set_prer {group_name} {

variable dash
variable set_prescale_val

set i2c_baseadd 0x00000000
set i2c_prescale       [format "0x%08x" [expr $i2c_baseadd + 0x0 ] ] 

   set mast [lindex [get_service_paths master] 0]
   open_service master $mast
   
   set set_prescale_val [format "0x%04x" [dashboard_get_property $dash $group_name.prer_wr_val text]]
   master_write_32 $mast $i2c_prescale $set_prescale_val
 }

 proc set_tx {group_name} {

variable dash
variable set_tx_val

set i2c_baseadd 0x00000000
set i2c_transmit     [format "0x%08x" [expr $i2c_baseadd + 0xc ] ] 

   set mast [lindex [get_service_paths master] 0]
   open_service master $mast
   
   set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.tx_wr_val text]]
   master_write_32 $mast $i2c_transmit $set_tx_val
 }

# gen_group3
#
proc gen_group3 { { group_name "myTab.g3" } } {
variable dash

dashboard_add $dash $group_name  group myTab
dashboard_set_property $dash $group_name itemsPerRow 2

# read reg 
#prer reg
dashboard_add $dash $group_name.prer label $group_name
dashboard_set_property $dash $group_name.prer text "Clock Prescale"
dashboard_set_property $dash $group_name.prer preferredWidth 30

dashboard_add $dash $group_name.prer_val label $group_name
dashboard_set_property $dash $group_name.prer_val text "-"
dashboard_set_property $dash $group_name.prer_val preferredWidth 30

#ctrl reg
dashboard_add $dash $group_name.ctrl label $group_name
dashboard_set_property $dash $group_name.ctrl text "Control"
dashboard_set_property $dash $group_name.ctrl preferredWidth 30

dashboard_add $dash $group_name.ctrl_val label $group_name
dashboard_set_property $dash $group_name.ctrl_val text "-"
dashboard_set_property $dash $group_name.ctrl_val preferredWidth 30

#status reg
dashboard_add $dash $group_name.status label $group_name
dashboard_set_property $dash $group_name.status text "Status"
dashboard_set_property $dash $group_name.status preferredWidth 30

dashboard_add $dash $group_name.status_val label $group_name
dashboard_set_property $dash $group_name.status_val text "-"
dashboard_set_property $dash $group_name.status_val preferredWidth 30

#transmit reg
dashboard_add $dash $group_name.transmit label $group_name
dashboard_set_property $dash $group_name.transmit text "Transmit"
dashboard_set_property $dash $group_name.transmit preferredWidth 30

dashboard_add $dash $group_name.transmit_val label $group_name
dashboard_set_property $dash $group_name.transmit_val text "-"
dashboard_set_property $dash $group_name.transmit_val preferredWidth 30

#receive reg
dashboard_add $dash $group_name.receive label $group_name
dashboard_set_property $dash $group_name.receive text "Receive"
dashboard_set_property $dash $group_name.receive preferredWidth 30

dashboard_add $dash $group_name.receive_val label $group_name
dashboard_set_property $dash $group_name.receive_val text "-"
dashboard_set_property $dash $group_name.receive_val preferredWidth 30

#command reg 
dashboard_add $dash $group_name.command label $group_name
dashboard_set_property $dash $group_name.command text "Command"
dashboard_set_property $dash $group_name.command preferredWidth 30

dashboard_add $dash $group_name.command_val label $group_name
dashboard_set_property $dash $group_name.command_val text "-"
dashboard_set_property $dash $group_name.command_val preferredWidth 30

#timer reg
dashboard_add $dash $group_name.timer label $group_name
dashboard_set_property $dash $group_name.timer text "Timer"
dashboard_set_property $dash $group_name.timer preferredWidth 30

dashboard_add $dash $group_name.timer_val label $group_name
dashboard_set_property $dash $group_name.timer_val text "-"
dashboard_set_property $dash $group_name.timer_val preferredWidth 30

# button 
dashboard_add $dash $group_name.bstart button $group_name
dashboard_set_property $dash $group_name.bstart text "Start Mon"
dashboard_set_property $dash $group_name.bstart onClick  "i2c_Control::count_g3  $group_name"


# reg edit
#prer reg
dashboard_add $dash $group_name.prer_wr label $group_name
dashboard_set_property $dash $group_name.prer_wr text "Clock Prescale"
dashboard_set_property $dash $group_name.prer_wr preferredWidth 30

dashboard_add $dash $group_name.prer_wr_val textField $group_name
dashboard_set_property $dash $group_name.prer_wr_val preferredWidth 60
 
dashboard_add $dash $group_name.prer_set button $group_name
dashboard_set_property $dash $group_name.prer_set text "Set"
dashboard_set_property $dash $group_name.prer_set onClick  "i2c_Control::set_prer $group_name"

dashboard_add $dash $group_name.null label $group_name

#transmit reg
dashboard_add $dash $group_name.tx_wr label $group_name
dashboard_set_property $dash $group_name.tx_wr text "Transmit"
dashboard_set_property $dash $group_name.tx_wr preferredWidth 30

dashboard_add $dash $group_name.tx_wr_val textField $group_name
dashboard_set_property $dash $group_name.tx_wr_val preferredWidth 60
 
dashboard_add $dash $group_name.tx_set button $group_name
dashboard_set_property $dash $group_name.tx_set text "Set"
dashboard_set_property $dash $group_name.tx_set onClick  "i2c_Control::set_tx $group_name"

}



2012年4月15日日曜日

DSD to PCM Converter 2

DSD to PCM Converterdで書いた、 YUKI-SAN の DSD to PCM Converter AES/EBUなどサンプリングレート352.8kHzをサポートしない規格のための、MSB8bitコード 0x09/0xF9を用いる代替規格の0x09/0xF9のコード挿入パターンの違いについて、早々に対応していただきました。ありがとうございます。


 私の想定と同じで、各ch毎に0x09/0xF9パターンを繰り返すようになっています。


 Waveファイル 先頭部分
上:DSD128_DoP(0x06/0xF9)- DSD to PCM Converter Version 0.0.12
下:DSD128_DoP(0x06/0xF9)- DSD to PCM Converter Version 0.0.13

2012年4月14日土曜日

DSD to PCM Converter

YUKI-SAN の DSD to PCM Converterが DSD128のDoP(DSD over PCM)をサポートし、AES/EBUなどサンプリングレート352.8kHzをサポートしない規格のための、MSB8bitコード 0x09/0xF9を用いるへの代替規格もサポートしてくれました。



左:DSD64_DoP(0x05/0xFA)  中:DSD128_DoP(0x05/0xFA) 右:DSD128_DoP(0x06/0xF9) 
WaveファイルのRIFFタグ情報 

 まだ、DSD128_DoP(0x06/0xF9)を試す環境が準備できていませんが、とりあえずフォーマットを確認するため、DSD64のデータを、DSD64_DoP(0x05/0xFA) へと、AudioGateでDSD128に変換して、 DSD128_DoP(0x05/0xFA)、DSD128_DoP(0x06/0xF9)に変換してみました。
 上記がRIFFタグ情報を覗いてみた様子です。DSD128_DoP(0x05/0xFA)では、2チャンネル、352.8kHz、24bitのwaveファイルとなっています。DSD128_DoP(0x06/0xF9)では、4チャンネル、176.4kHz、24bitのwaveファイルとなっています。


Waveファイル 先頭部分
上:DSD128_DoP(0x06/0xF9) 
中:DSD128_DoP(0x05/0xFA)
下:DSD64_DoP(0x05/0xFA) 

 つぎにデータ部を見てみます。上が、DSD128_DoP(0x06/0xF9)、DSD128_DoP(0x05/0xFA) DSD64_DoP(0x05/0xFA) のデータの先頭部分です。
 0x00002Bまでが、タグ情報で、0x00002Cからがデータ部になっているようです。

  オレンジでハッチングしているのは、DSD128でのLchデータと思われる部分の先頭から20byte分になります。 
 0x05/0xFA方式では、16bit毎にL/Rchが埋め込まれています。
 0x06/0xF9方式では、32bir毎にL/Rchが埋め込まれています。

 これは、4chマルチチャネルのWaveファイルの1番目と2番目のチャネルにLchを、3番目と4番目のチャネルにRchを埋め込んでいるためで、これでDoPの規定に合っていると推測します。


  水色、黄色でハッチングしているのが、0x05/0xFAあるいは0x06/0xF9のコード、0x05/0xFA方式の場合は、DSDデータ16bit- 0x05 - DSDデータ16bit - 0xFAの順序で埋め込まれています。
 0x06/0xF9方式の場合も、DSDデータ16bit- 0x06 - DSDデータ16bit - 0xF9の順序で埋め込まれています。
 
 こちらは、少し私の推測と異なります。 0x06/0xF9方式の場合、4chの各chで0x06/0xF9を交互に埋め込むのではと推測しています。(あまり自信はありません...)

2012年4月12日木曜日

QuartusII システムコンソール Dashboard

システムコンソールのGUI機能、Dashboardの習得のため、DailとTimeChartで、FPGA内に作った32bit Timerカウンタを読みだして表示させてみました。

 Dashboardでは、これ以外にも Label, Text, Button, checkBox, LED, ComboBox, Table, BarChart, LineChart, PiChartなどが使えます。



システムコンソール Dashboard

上記Dashboardの表示Tabに関するTclは下記

namespace eval i2c_Control {

variable dash [add_service dashboard i2c_Control "I2C Control" "Tools/Dashboard"]

dashboard_set_property $dash self developmentMode true
dashboard_set_property $dash self itemsPerRow 1


# count g2 
proc count_g2 {group_name} {


variable dash
variable g2_cnt_val
variable g2_cnt_en


#  Timer read and display dail and chart
if { $g2_cnt_en } {


   set mast [lindex [get_service_paths master] 0]


   open_service master $mast


 # 0x40番地の32bit Timer counterをリードし、g2_cnt_valにセット    
   set g2_cnt_val [master_read_32 $mast 0x040 1]


  # dialへの読み取ったカウント値のセット
   dashboard_set_property $dash $group_name.dial value [expr ($g2_cnt_val /10000000)]
  # timechartへの読み取ったカウント値のセット
   dashboard_set_property $dash $group_name.tchart latest [expr ($g2_cnt_val /1000000)]

   after 1000 i2c_Control::count_g2 $group_name
   }
 }


# gen_group2 


proc gen_group2 { { group_name "myTab.g2" } } {
variable dash


dashboard_add $dash $group_name  group myTab
dashboard_set_property $dash $group_name itemsPerRow 1


# dial
dashboard_add $dash $group_name.dial dial $group_name
dashboard_set_property $dash $group_name.dial title "Dial_fpga"
dashboard_set_property $dash $group_name.dial min 0
dashboard_set_property $dash $group_name.dial max 440
dashboard_set_property $dash $group_name.dial preferredWidth 300
dashboard_set_property $dash $group_name.dial preferredHeight 300
dashboard_set_property $dash $group_name.dial value 0
  
# timechart
dashboard_add $dash $group_name.tchart timeChart $group_name
dashboard_set_property $dash $group_name.tchart title "Time chart"
dashboard_set_property $dash $group_name.tchart preferredWidth 800
dashboard_set_property $dash $group_name.tchart labelX "Time"
dashboard_set_property $dash $group_name.tchart labelY "Counter value"
dashboard_set_property $dash $group_name.tchart latest 0
  
# button to start the counter
dashboard_add $dash $group_name.bstart button $group_name
dashboard_set_property $dash $group_name.bstart text "Start counter"
dashboard_set_property $dash $group_name.bstart onClick  "set i2c_Control::g2_cnt_en 1; dashboard_set_property $dash  $group_name.bstart enabled false; dashboard_set_property $dash  $group_name.bstop enabled true; i2c_Control::count_g2  $group_name"
 
# button to stop the counter
dashboard_add $dash $group_name.bstop button $group_name
dashboard_set_property $dash $group_name.bstop text "Stop counter"
dashboard_set_property $dash $group_name.bstop enabled false
dashboard_set_property $dash $group_name.bstop onClick   "set i2c_Control::g2_cnt_en 0; dashboard_set_property $dash  $group_name.bstart enabled true; dashboard_set_property $dash  $group_name.bstop enabled false"
}

# tabbedGroup


dashboard_add $dash myTab tabbedGroup self
dashboard_set_property $dash myTab preferredWidth 1024
dashboard_set_property $dash myTab preferredHeight 700


# Create Grourps


gen_group1 "Dial"
gen_group2 "Counter_fpga"
#gen_group3 "I2C_Control"
}

2012年4月8日日曜日

DSD Over PCM標準規格1.1 DSD128サポート

Music TO GO!さんでDSD Over PCM標準規格が1.1に更新してDSD128をサポートしたことが紹介されています。
dCS方式と書いていましたが、この言い方は改めて今後はDoP(DSD Over PCM)と言ったほうがよさそうです。今後はDoPと書くようにします。

DoP open Standard Method for transferring DSD Audio over PCM Frames  Version 1.1

 うれしいことにAES/EBU等384kHzのPCMを標準ではサポートしないインタフェースでのDSD128のサポート方法もSolution2として規格化してくれています。
要は、192kHz@24bitのライン1本でDSDの1ch(LchもしくはRch)を載せ、2本でDSD128のL/Rペアをサポートするインタフェースということになります。

MarkerはSolution1の0x05/0xFAオルタネートとは異なり、0x06/0xF9のオルタネートパターンになり、AES/EBUなどのLch/Rchに交互に16bitの1ch分のDSDデータを入れる方式のようです。

据え置きのPCとのオーディオインタフェースはUSBではなく、電源完全分離が可能な光インタフェース(ADAT RME RayDAT)を使用をメインに想定しているので、もし規格化されなくとも、同じ事をなんとか実現することを考えていましたが、規格化されたので対応する再生ソフトが順次出てくると思いますので、非常にラッキーです。


また、サポートメンバーにCEntranceが加わったとのこと、XMOS用のCEntrance ASIOドライバは極性現状反転処理が入っていてビットパーフェクトになっていないようなのですが、これでCEntranceのドライバも使えるようになると思われます。