Hatena::ブログ(Diary)

APC的雑記

 

2018-05-31 スターチャンネルの設定をしようと思ったら、アニマックスもディズニ

スターチャンネルの設定をしようと思ったら、アニマックスもディズニーチャンネルも
映ってなかった件
BonDriver_PT3-S.ChSet.txt BS13/TS2 BSアニマックス 0 16 6 18130 BS3/TS2 Disney Channel 0 17 1 17970
BonDriver_Spinel_S0.ch2 / BonDriver_Spinel_S1.ch2 BSアニマックス,0,16,236,,236,4,18130,1 ディズニー・チャンネル,0,17,256,,256,4,17970,1 スター・チャンネル3,0,15,10,,202,4,16626,1
ch-bs.txt BSアニマックス 783697618 236 ディズニーチャンネル 771114546 256
dtv.ini (xチューナー数) BSアニマックス=783697618 ディズニーチャンネル=771114546
RecTask.ini 0x46D2=11958 0x4632=11766
更にスター・チャンネル3も間違ってたので修正

2018-05-17 WASAPI loopback で、リアルタイムスペクトルアナライザー

特に参考になったページ
numpyでスペクトログラムによる音楽信号の可視化 https://qiita.com/namaozi/items/dec1575cd455c746f597
【Python】matplotlibの手動で描画更新 http://oregengo.hatenablog.com/entry/2017/04/20/111932
Speeding up Matplotlib plotting times for real-time monitoring purposes https://taher-zadeh.com/speeding-matplotlib-plotting-times-real-time-monitoring-purposes/
#coding:utf-8
import pyaudio
import numpy as np
import matplotlib.pyplot as plt
import win32api
import time

# WASAPI loopback 対応の PyAudio が必要  Windows Vista 以降
# https://github.com/intxcc/pyaudio_portaudio
# Precompiled & Extended | PyAudio with PortAudio for Windows

# Esc を押すと停止

BufferSize = 2048     # Flame Buffer 48.0khz = 23.4375fps  44.1khz = 21.5332fps

DeviceID = 9999  # WASAPI が見つからないときに意図しない defaultDevice を開かせない
useloopback = False                    # WASAPI が見つかったら True になる
pya = pyaudio.PyAudio()
for i in range(pya.get_host_api_count()):
	if 'Windows WASAPI' in pya.get_host_api_info_by_index(i).get('name'):
		DeviceID = pya.get_host_api_info_by_index(i).get('defaultOutputDevice')
		useloopback = True             # WASAPI 専用
		break

device_info = {}
device_info = pya.get_device_info_by_index(DeviceID)

SampleRate = int(device_info['defaultSampleRate'])
if useloopback:
	print ('Using loopback mode. ', str(SampleRate)+'hz')

channelcount = device_info['maxInputChannels'] if (device_info['maxOutputChannels'] < device_info['maxInputChannels']) else device_info['maxOutputChannels']

fq = np.fft.fftfreq(1 + BufferSize // 2, 1 / SampleRate)

		### 描画設定 ###
#plt.style.use('dark_background')         # DARK!!
fig = plt.figure(figsize=(10, 4), dpi=80) # 描画枠(figsize=(8, 6), dpi=100, facecolor='w')

#axL = fig.add_axes((0.1, 0.5, 0.9, 0.4) )  # (left, bottom, width, height)  分けて表示
#axR = fig.add_axes((0.1, 0.1, 0.9, 0.4), sharex=axL, sharey=axL)
axL = fig.add_axes((0.07, 0.15, 0.92, 0.75) )  # 重ねて表示
axR = fig.add_axes((0.07, 0.15, 0.92, 0.75), sharex=axL, sharey=axL)

fig.canvas.draw()

bgL = fig.canvas.copy_from_bbox(axL.bbox)  # cache the background
bgR = fig.canvas.copy_from_bbox(axR.bbox)

lineL, = axL.plot(fq, fq, '#8080ff')   # L=Blue Line設定
lineR, = axR.plot(fq, fq, '#800020')   # R=Red  とりあえず何か表示しておく?

axL.set_xscale('log')                  # x はlog表記
#axL.set_xlim([0, SampleRate//2])
axL.set_ylim([0,4000])
#axR.set_ylim([4000,0])                # 上下反転
axL.set_title('Left = BLUE   Right = RED')
axL.set_ylabel('amplitude spectrum')   # 振幅
axR.set_xlabel('Frequency [Hz]')       # 周波数
axL.tick_params(labelbottom=False)     # Left  の下ラベルを非表示
axR.tick_params(labelleft=False)       # Right の左ラベルを非表示

fig.show()

recorded_frames = []
window = np.hamming(BufferSize)        # ハミング窓

def callback(in_data, frame_count, time_info, status):
	recorded_frames.append(in_data)
	data = np.frombuffer((b''.join(recorded_frames) ), dtype = 'int16')
	data.shape = -1,2                  # soundfile でファイルに書き込んでた時の名残

	frameL = data.T[0][:]              # 1.フレームの取得
	frameR = data.T[1][:]
	windowedL = window * frameL        # 2.窓関数を適用
	windowedR = window * frameR
	fft_resultL = np.fft.rfft(windowedL)  # 3.高速フーリエ変換(FFT)
	fft_resultR = np.fft.rfft(windowedR)  # rfftは非負の周波数のみ

	# 4.周波数には虚数成分を含むので絶対値をabsで求めてから
	fft_dataL = np.abs(fft_resultL) / BufferSize * 2  # サンプル数で割って
	fft_dataR = np.abs(fft_resultR) / BufferSize * 2  # 交流成分は2倍する

	recorded_frames.clear()

	### 描画 ###
	lineL.set_data(fq, fft_dataL)      # 描画data
	lineR.set_data(fq, fft_dataR)
	fig.canvas.restore_region(bgL)     # 描画をクリア
	fig.canvas.restore_region(bgR)     #
	axL.draw_artist(lineL)             # 描画したいartistを登録
	axR.draw_artist(lineR)             #

	return(None, pyaudio.paContinue)

stream = pya.open(
			format = pyaudio.paInt16,
			channels = channelcount,
			rate = SampleRate,
			input = True,
			frames_per_buffer = BufferSize,
			input_device_index = device_info['index'],
			start=False,
			stream_callback=callback,
			as_loopback = useloopback  # WASAPI 専用
			)

pos = 0
stream.start_stream()                  # start the stream (4)
while 1:
	if win32api.GetKeyState(0x1B):     # ESC が押されていればループ停止
	# ESCAPE 0x1B  SPACE 0x20  END 0x23  HOME 0x24    WinUser.h
		break
	pos += 1
	time.sleep(0.04)                   # 0.04 = 25fps

	fig.canvas.update()                # 再描画
	fig.canvas.flush_events()


stream.stop_stream()  # PyAudio stop stream (4)
stream.close()
pya.terminate()       # close PyAudio (5)

print(round(pos * 0.04 ,1), 's')

f:id:APC:20180517235718p:image:right

2018-05-10 PythonでPyAudioでPortAudioでWASAPIでLoopbackでrecordingの事

https://github.com/intxcc/pyaudio_portaudio
手順通りビルドしてみたけれど動かないので、 Anaconda3\Lib\site-packages\PyAudio-0.2.11-py3.6-win-amd64.egg\ 内の3ファイル、 _portaudio.cp36-win_amd64.pyd _portaudio.py pyaudio.py を、 Anaconda3\Lib\site-packages\ に上書きコピー これで動いたけど、これで良かったんだろうか… Microsoft Visual Studio (2017) のインストールからやったけど、Cygwin の方が良かった気がする。