読者です 読者をやめる 読者になる 読者になる

ひこぽんのーと

覚書と雑記です。

pythonで音声を再生するのこと その4

おまけ。

pysdl2のsdl2.sdlmixer.Mix_LoadMUSを使った場合、
一度に鳴らせる音声はひとつだけ。

つまり、BGMを背景にセリフを再生する、といった事は、
この関数ではできない。

そんな場合は、チャネル再生を使う。
チャネル再生には、チャンクとチャネルを取得すればよく、
関数も用意されている。

パッケージ 関数 備考
sdl2.sdlmixer Mix_LoadWAV 音声を読み込み、チャンクを取得する。
WAVE, AIFF, RIFF, OGG, VOCが利用可能。
sdl2.sdlmixer Mix_PlayChannel チャネルを取得して再生を行う。
sdl2.sdlmixer Mix_Pause 再生の停止
sdl2.sdlmixer Mix_FreeChunk チャンクの開放

以下にソース。

# -*- coding: utf-8 -*-

from ctypes import *
from sdl2 import *
from sdl2.sdlmixer import *
from time import sleep


if __name__ == u"__main__":
	SDL_Init(SDL_INIT_AUDIO)
	Mix_Init(MIX_INIT_OGG)
	Mix_OpenAudio(22050, AUDIO_S16, 2, 4096)

	path = c_char_p(b"OGGファイルのパス")
	chunk = Mix_LoadWAV(path)
	Mix_VolumeMusic(64)
	channel = Mix_PlayChannel(-1, chunk, 1)
	sleep(100)
	Mix_Pause(channel)
	Mix_FreeChunk(chunk)
	SDL_Quit()

前回のソースと今回のソースを組み合わせれば、
複数の音声を同時に再生できるようになる。
チャネル再生にはMP3が使えないっと言うのが玉にキズだけど。。。

pythonで音声を再生するのこと その3

その2の続き。

再生の手順としては、基本的にpygameの時とは変わらない。

ライブラリの初期化 → 音声のロード → 再生・停止 → ライブラリの開放

といった手順はわかるものの、どう書くのか。
pythonのサンプルも見つけられなかったので、
sdl-mixerのサイトからダウンロードできるC用のサンプルを参考に作ってみた。

一応、使う関数は以下の通り。

パッケージ 関数 備考
sdl2 SDL_Init ライブラリの初期化。
引数に初期化対象を指定する必要がある。
pygame.init()に当たる。
sdl2 SDL_Quit ライブラリの開放。
sdl2.sdlmixer Mix_Init ミキサーの初期化。再生対象のファイル形式を指定する。
pygame.mixer.init()にあたる。
sdl2.sdlmixer Mix_OpenAudio ミキサーの再生クオリティを指定する。
pygame.mixer.init()にあたる。
sdl2.sdlmixer Mix_LoadMUS 音声ファイルの読み込み。
pygame.mixer.music.load()にあたる。
sdl2.sdlmixer Mix_PlayMusic 音声ファイルの再生。
pygame.mixer.music.play()にあたる。
sdl2.sdlmixer Mix_PauseMusic 再生の停止。
pygame.mixer.music.pause()にあたる。
sdl2.sdlmixer Mix_FreeMusic 音声ファイルの開放。

以下にソース。

# -*- coding: utf-8 -*-

from ctypes import *
from sdl2 import *
from sdl2.sdlmixer import *
from time import sleep


if __name__ == u"__main__":
	SDL_Init(SDL_INIT_AUDIO)
	Mix_Init(MIX_INIT_MP3)
	Mix_OpenAudio(22050, AUDIO_S16, 2, 4096)

	path = c_char_p(b"MP3のファイルパス")
	music = Mix_LoadMUS(path)
	Mix_VolumeMusic(64)
	Mix_PlayMusic(music, 1)
	sleep(300)
	Mix_PauseMusic()
	Mix_FreeMusic(music)
	SDL_Quit()

とまぁ、簡単に音が出る、けれど、注意点もある。

関数呼び出しのパラメータと復帰値については注意が必要。
基本、こいつらはCの型を要求する。
pythonの型からCの型へ変えてやらないと、うまく実行できない。*1
Mix_LoadMUSの引数は、libsdl-mixerでは、char *なので、
ここではctypesを使って、byte列をCのchar *に変えて渡している。
また、ここではチェックを省いているが、
復帰値は関数実行の成否を表しているので、都度、チェックを行い、
エラー時には中断するなりのエラーハンドリングを書いてやる必要がある。

それさえ気をつければ、pygameのように扱える、と思う。

*1:正確にはpysdl2がそういうスタンスだからだが。。。

pythonで音声を再生するのこと その2

前にpythonでMP3を再生する方法を書いた。

nagamitsu1976.hatenadiary.jp

あの時のソースをpython3で実行してみたら、ちょっとした問題があることがわかった。
python3 + pygameでは音割れがひどく、まともに再生できない場合がある。
(PC毎に症状が違うし、正しく再生できる時もたまにある)

これはイカンと思い、pygameに変わる別のライブラリとして、
pysdl2を使うことにした。

Welcome to PySDL2’s documentation! — PySDL2 0.9.5 documentation

pysdl2はpygameの後継と言われている(らしい)ライブラリではあるけれど、
C言語用のSDLライブラリのpythonラッパーととらえるべきで、
pygameよりは扱いが多少、難しい...と言うよりは面倒な印象。
ともかく、使ってみることにした。

まずは、導入方法から。

OSのパッケージマネージャからインストール

Ubuntuではapt-getでインストールできる。

# python2の場合
sudo apt-get install python-sdl2

# python3の場合
sudo apt-get install python3-sdl2

pipを使う場合

pipを使う場合はこのようにする。

pip install pysdl2

pipを使った場合、実行に必要なSDL2系のライブラリはインストールされないので、
別途、インストールする必要がある。
今回はオーディオ関係しか使わないので、libsdl2-mixerのみをインストールした。

sudo apt-get install libsdl2-mixer-2.0-0

といったわけで、次へ続く

Djangoをやってみよう。 hello, world その1

Djangoプロジェクトを作ってみる。

ブランクプロジェクトの作成

ブランクプロジェクトはdjango-adminコマンドを使って作る。
オプションにstartprojectを指定し、パラメータにプロジェクト名を入力する。

django-admin startproject hello

出来上がったプロジェクトはこんな感じ。

hello
├── hello
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
ファイル 概要
hello プロジェクトディレクト
hello(内側の) パッケージディレクト
__init__.py パッケージファイル
settings.py 設定ソース。 プロジェクトの設定を司る。
urls.py プロジェクトのURLを定義するファイル
wsgi.py WSGI互換Webサーバー用のエンドポイントを司る。
manage.py コマンドラインユーティリティ。プロジェクトを作る上で様々な用途がある。

サーバー起動

生成されたmanage.pyを使ってサーバーを立ち上げる。

python manage.py runserver

f:id:nagamitsu1976:20170330180909p:plain

ターミナルに起動情報が表示されるのでブラウザから繋いでみる。
f:id:nagamitsu1976:20170330181054p:plain
この画面が表示されればOK。

ちなみにポート番号だけ指定したい場合は、以下のようにする。

python manage.py runserver 8080

IPアドレスとポート番号を指定したい場合にはこうなる。

python manage.py runserver {IPアドレス}:{ポート番号}

と、ブランクプロジェクトの作成はここまで。
ソースの追加は次回につづく。

Djangoをインストールするのこと

Python環境にDjangoをインストールしてみる。

インストールにあたっては本家サイトを参照して行ってみた。
手順としては本家サイトにあるようにpipを使ってインストールする。
How to install Django | Django documentation | Django

pip install django

正しくインストールできたかはpythonからモジュールをインポートして
バージョン表示してみれば良い。

import django
django.VERSION

f:id:nagamitsu1976:20170330171143p:plain

これで環境ができた。
次はhello,worldを書いてみよう。

Pythonの仮想環境を作ってみるのこと

今更だけど、pythonの仮想環境を作ってみる。
というのも、python3 + Djangoを試してみたいからだ。

一応、python2版のDjangoならば、
パッケージマネージャからインストールできるのだが、
バージョンが古いのでDjangoチュートリアルすら実行できない。

したがって、今回は仮想環境を作り、
仮想環境上にDjangoをインストールしてみようと思う。

仮想環境の構築

まず、virtualenvという仮想環境を構築できるツールをインストールする。

sudo apt-get install virtualenv

インストールしたらvirtualenvを使って仮想環境を作る。

virtualenv -p /usr/bin/python3 py3env

オプションで指定しているのは仮想環境で使用するPythonインタプリタのパス。
未指定の場合は、システムデフォルトのPythonインタプリタが使われる。
パラメータには作成する仮想環境のパスを指定する。
コマンドが終了すると環境の出来上がり。

仮想環境の有効化

ターミナルから作成した仮想環境に移動して、環境を有効化するコマンドを実行する。
仮想環境のbinディレクトリ配下にあるactivateファイルをsourceコマンドで読みこめば良い。

source bin/activate

コマンド実行後、
ターミナル上のユーザ名の前に仮想環境名が表示されれば成功。
ついでにPythonのバージョンを見てみる。
f:id:nagamitsu1976:20170330121243p:plain

Pythonのバージョンが3.5になっているのがわかる。
ここで仮想環境を抜けてみる。
抜けるにはdeactivateコマンドを使う。
仮想環境を抜けたあとのPythonのバージョンを見てみる。
f:id:nagamitsu1976:20170330121551p:plain

Pythonのバージョンが2.7.11でデフォルト環境が維持されているのがわかる。
というわけで仮想環境ができた。
以降、この環境を使ってDjangoを試してみる。

ちなみに仮想環境を破棄するには、ディレクトリ毎削除してしまえば良い。

追記: virtualenvのオプションについて。*1
上の例ではpythonインタプリタのパスをオプション指定していたが、
これだと含有するパッケージはほぼ空なので、
必要なパッケージをpipでインストールする必要がある。
そこで、--system-site-packagesを追加してやると、
コピー元となるシステム上のpython環境にインストールされているパッケージも
コピーしてくれる。
手間を考えるとこっちのが便利だね。

virtualenv -p /usr/bin/python3 --system-site-packages py3env

*1:pipでnotify2がインストールできなくて、結局、apt-getでpython3-notify2をインストールしてから、これで環境にコピーした。

SQuirreL SQLのこと その4

おまけ。

SQuirreL SQLSqliteを使いたい場合について。

ドライバリストにSqliteが無いからと言って使えない、というわけではないらしい。
Java製だからJDBCドライバがあれば接続できるようだ。

ついでに、以下にメモっておく。
ここのサイトが参考となった。

Accessing SQLites database using SQuirrel SQL Client

上記サイトの内容を参考に、新規ドライバを追加する。
注意点としてはWebサイトURLとして書かれているURLはリンク切れしている。
必要に応じて、SqliteなりSqlite JDBCドライバのWebページへのリンクを書いておくと良い。
ちなみにJDBCドライバは下記から取得した。

xerial / sqlite-jdbc — Bitbucket

f:id:nagamitsu1976:20170329104156p:plain

ドライバの定義後、エイリアス設定をする。
サンプルにしたがって書けばよく、
[jdbc:sqlite://]の後ろにデータベースファイルのパスを記載するだけで良い。
f:id:nagamitsu1976:20170329104416p:plain

接続するとちゃんとデータが拾える。
f:id:nagamitsu1976:20170329104459p:plain

うむうむ、問題ない。