スライス操作は、シーケンス型のオブジェクト(文字型、リスト型、など)の部分を取り出す操作。
部分p = s[開始インデックス : 終了インデックス : 刻み]
s="abcde" として、インデックス値は以下のとおり。
| a | b | c | d | e |
0 1 2 3 4 5 左からの位置
-5 -4 -3 -2 -1 右からの位置
s[3]=s[-2]="d"
s[1:3]=s[-4:-2]=s[1:-2]=s[-4:3]="bc"
s[2:]=s[-3:]="cde"
s[:2]=s[:-3]="ab"
s[:] = "abcde"
配列L=["a", "b", "c", "d", "d"] でも、同様。
L[2:]=L[-3:]=["c", "d", "e"] など。
2010年12月24日金曜日
2010年12月21日火曜日
python:listオブジェクト(基本)
リストの基本。
リストの要素は添字で指定可能。
L = ['a', 'b' ,'c'] の場合、
L[0] = 'a'
L[1] = 'b'
L[2] = 'c'
添字を後ろから-1,-2, ...と指定することも可能。
L[-3] = 'a'
L[-2] = 'b'
L[-1] = 'c'
添字の範囲指定も可能。添字のスタートとエンドはコロンで区切る。
L[1: 2] = ['b', 'c']
L[-2: -1] = ['b', 'c']
L[1:-1] = ['b', 'c']
リストの要素はデータ型が混在してもよい。
L=[a, "b", 50]
L[0] 変数aの値(データ型はこれだけではわからない)
L[1] 文字型のb
L[2] 数字型の50
リストの要素は添字で指定可能。
L = ['a', 'b' ,'c'] の場合、
L[0] = 'a'
L[1] = 'b'
L[2] = 'c'
添字を後ろから-1,-2, ...と指定することも可能。
L[-3] = 'a'
L[-2] = 'b'
L[-1] = 'c'
添字の範囲指定も可能。添字のスタートとエンドはコロンで区切る。
L[1: 2] = ['b', 'c']
L[-2: -1] = ['b', 'c']
L[1:-1] = ['b', 'c']
リストの要素はデータ型が混在してもよい。
L=[a, "b", 50]
L[0] 変数aの値(データ型はこれだけではわからない)
L[1] 文字型のb
L[2] 数字型の50
2010年12月20日月曜日
python:listオブジェクト
リストオブジェクト(list)は、複数要素の集まり。要素の変更可能。
L=[] リストのクリア
L=[v,w,...] リストに値v、w、...を設定
L=list(s) シーケンス型→リスト sが文字列なら1文字ずつの要素になる
L=csv.split(",") csv文字列→リスト
len(L) リストの要素数
L.count(v) 要素vの件数
v = L[i] i番目の値の取得(最初の要素は0番目)
i = L.index(v) 値vの最初の要素位置(最初の要素は0番目)
w = L.index(v,i,j) 同上。ただし、wはi番目以上、j番目未満。
L.append(v) 値をリストの最後に追加
L.insert(v,i) 値をi番目の要素として追加
L.pop(i) i番目の要素を削除。i未指定の場合、最後の要素を削除
if v in L: 値vの有無判定
L = L1+L2 リストの結合
L.sort() リストそのものの並び替え。ただし、昇順。
L.sort(key=int) 同上。ただし、値を数値として並び替え
L.sort(reverse=True) 同上。ただし、降順。
L2 = sorted(L1) リストを並び替えてコピー。元のリストL1はソート前と変わらず。
L2 = sorted(set(L1)) リストを重複削除して並び替え。
L1 = L2 リストのポインターのコピー。この操作後にL1を変更するとL2も変わる。
L1 = L2[:] リストの値のコピー。この操作後にL1を変更してもL2は変わらない。
L=[] リストのクリア
L=[v,w,...] リストに値v、w、...を設定
L=list(s) シーケンス型→リスト sが文字列なら1文字ずつの要素になる
L=csv.split(",") csv文字列→リスト
len(L) リストの要素数
L.count(v) 要素vの件数
v = L[i] i番目の値の取得(最初の要素は0番目)
i = L.index(v) 値vの最初の要素位置(最初の要素は0番目)
w = L.index(v,i,j) 同上。ただし、wはi番目以上、j番目未満。
L.append(v) 値をリストの最後に追加
L.insert(v,i) 値をi番目の要素として追加
L.pop(i) i番目の要素を削除。i未指定の場合、最後の要素を削除
if v in L: 値vの有無判定
L = L1+L2 リストの結合
L.sort() リストそのものの並び替え。ただし、昇順。
L.sort(key=int) 同上。ただし、値を数値として並び替え
L.sort(reverse=True) 同上。ただし、降順。
L2 = sorted(L1) リストを並び替えてコピー。元のリストL1はソート前と変わらず。
L2 = sorted(set(L1)) リストを重複削除して並び替え。
L1 = L2 リストのポインターのコピー。この操作後にL1を変更するとL2も変わる。
L1 = L2[:] リストの値のコピー。この操作後にL1を変更してもL2は変わらない。
2010年12月16日木曜日
python:ファイル名の接頭語、接尾語チェック
# -*- coding: shift_jis -*-
#
import os,sys
def PreSufChk(sIn, sPre="", sSuf=""):
"""ファイルの接頭語と接尾語のチェック
Args:
sIn: 入力ファイル
sPre: 接頭語(prefix)
sSuf: 接尾語(suffix)
Returns:
接頭語、接尾語が一致するか(bool)
"""
return ((sIn.upper().startswith(sPre.upper())) \
and (sIn.upper().endswith(sSuf.upper())))
def main():
sIn="abc.txt"
print PreSufChk(sIn, "a", "txt") #True
print PreSufChk(sIn, "b", "txt") #False
print PreSufChk(sIn, "a", "csv") #False
raw_input()
return True
if __name__=="__main__": main()
-----
・文字列.upper() 大文字に変換する。小文字に変換は.lower()
上記例では、引数の大文字小文字に関わらず、同じ値として扱う。
・a.startswith(sPre) aにsPreが前方一致したらTrue
a.endswith(sSuf) aにsSufが後方一致したらTrue
・\ は、1つの文が複数行にまたがるときの継続行の意味。
#
import os,sys
def PreSufChk(sIn, sPre="", sSuf=""):
"""ファイルの接頭語と接尾語のチェック
Args:
sIn: 入力ファイル
sPre: 接頭語(prefix)
sSuf: 接尾語(suffix)
Returns:
接頭語、接尾語が一致するか(bool)
"""
return ((sIn.upper().startswith(sPre.upper())) \
and (sIn.upper().endswith(sSuf.upper())))
def main():
sIn="abc.txt"
print PreSufChk(sIn, "a", "txt") #True
print PreSufChk(sIn, "b", "txt") #False
print PreSufChk(sIn, "a", "csv") #False
raw_input()
return True
if __name__=="__main__": main()
-----
・文字列.upper() 大文字に変換する。小文字に変換は.lower()
上記例では、引数の大文字小文字に関わらず、同じ値として扱う。
・a.startswith(sPre) aにsPreが前方一致したらTrue
a.endswith(sSuf) aにsSufが後方一致したらTrue
・\ は、1つの文が複数行にまたがるときの継続行の意味。
2010年12月11日土曜日
町字の表記(2)
先走って 「大字なし地域」 を抜かしてしまった。
0.町字が0段階
例)長野県 南箕輪村役場
長野県上伊那郡南箕輪村 4825-1
「大字」が無い地域が全国で100ヶ所ほど存在する。
2000年頃には150ヶ所以上あったが、平成の大合併でだいぶ減った。
大字なし地域の歴史的な経緯の概要は以下のとおり。
1973年(明治6年)の地租改正で課税対象が収穫物から土地になり、土地に徴税用の管理記号が必要になった。
そして、「○○村 123番地」などという「町村名+番地」という表記になり、住所表記に流用されることになる。(市区町村がまだ法制化される前で、この時点でまだ現在の「市」は無い)
この当時70,000以上あった村は現在の大字ほどの領域。
その後、市区町村合併があり、この地租改正時の村はその多くが大字になり、大字名などの地域名として新設、分割、消滅、再使用などを複雑に繰り返し現在に至る。
では、以下の場合はどうなるか?
(1)地租改正当時以降、市区町村合併を一度もせず、町字名の整理などをしていない。
(2)市区町村合併しても「合併後町村名+番地」の表記を続ける。
それが現在の「大字なし地域」だ。
ちなみに例で挙げた南箕輪村は1875年(明治8年)に発足してから一度も市区町村合併をしていない。
今日はこのあたりで。
0.町字が0段階
例)長野県 南箕輪村役場
長野県上伊那郡南箕輪村 4825-1
「大字」が無い地域が全国で100ヶ所ほど存在する。
2000年頃には150ヶ所以上あったが、平成の大合併でだいぶ減った。
大字なし地域の歴史的な経緯の概要は以下のとおり。
1973年(明治6年)の地租改正で課税対象が収穫物から土地になり、土地に徴税用の管理記号が必要になった。
そして、「○○村 123番地」などという「町村名+番地」という表記になり、住所表記に流用されることになる。(市区町村がまだ法制化される前で、この時点でまだ現在の「市」は無い)
この当時70,000以上あった村は現在の大字ほどの領域。
その後、市区町村合併があり、この地租改正時の村はその多くが大字になり、大字名などの地域名として新設、分割、消滅、再使用などを複雑に繰り返し現在に至る。
では、以下の場合はどうなるか?
(1)地租改正当時以降、市区町村合併を一度もせず、町字名の整理などをしていない。
(2)市区町村合併しても「合併後町村名+番地」の表記を続ける。
それが現在の「大字なし地域」だ。
ちなみに例で挙げた南箕輪村は1875年(明治8年)に発足してから一度も市区町村合併をしていない。
今日はこのあたりで。
2010年12月10日金曜日
町字の表記(1)
町字とは、住所構造のうち、”市区町村”より後で”番地号”より前の部分、と定義しておく。
表記パターンは一筋縄ではいかない。まず基本形から。
1.町字が1段階
1-1.大字
例)小林市役所
宮崎県小林市 細野 300
1-2.小字
例)福知山市役所
京都府福知山市 字内記 13番地の1
(おまけ)丁目
例)下田市立下田小学校
静岡県下田市 五丁目 3番1号
※これは通常の大字の下の”丁目”ではなく、正しくは”五丁目”という大字である。下田市には、1~6丁目まで揃っている。
2.町字が2段階
2-1.大字+丁目
例)東京都新宿区役所
東京都新宿区 歌舞伎町 1丁目 4番1号
2-2.大字+小字
例)宮城県名取市役所
宮城県名取市 増田 字柳田 80
ここまではよく目にする町字の構造である。
次回、さらなる迷宮へ続く。
表記パターンは一筋縄ではいかない。まず基本形から。
1.町字が1段階
1-1.大字
例)小林市役所
宮崎県小林市 細野 300
1-2.小字
例)福知山市役所
京都府福知山市 字内記 13番地の1
(おまけ)丁目
例)下田市立下田小学校
静岡県下田市 五丁目 3番1号
※これは通常の大字の下の”丁目”ではなく、正しくは”五丁目”という大字である。下田市には、1~6丁目まで揃っている。
2.町字が2段階
2-1.大字+丁目
例)東京都新宿区役所
東京都新宿区 歌舞伎町 1丁目 4番1号
2-2.大字+小字
例)宮城県名取市役所
宮城県名取市 増田 字柳田 80
ここまではよく目にする町字の構造である。
次回、さらなる迷宮へ続く。
2010年12月7日火曜日
なぜ東京特別区には市が付かないのか?
政令指定都市では、都道府県+市+区 という表記だ。
例)
北海道 札幌市 中央区
大阪府 大阪市 中央区
東京特別区では、都道府県+区という表記だ。
例)
東京都 中央区
これでは特別区全体を表す地域呼称が無く、変則的な感じは免れない。
では、なぜ東京特別区には市が付かないのか?
それは、1943年に戦時法制の一環として、旧東京府と旧東京市が合併したため。
東京都制(wikipedia)
現在は1都1道2府43県だが、当時は1道3府43県。
つまり、東京は府であり、区部にも市があり、東京の区は京都大阪の区と同列だった。
例)
東京府 東京市 日本橋区
確かにこれは現在の京都府京都市などと同じ住所表記だ。
この状態から、旧東京府と旧東京市が合併することになり、県レベルの次が区になってしまった。
例)
東京府 東京市 日本橋区と京橋区が合併して、「東京都 中央区」になった。
それにしても、都道府県レベルと市区町村レベルの合併というのは無理やりである。
例)
北海道 札幌市 中央区
大阪府 大阪市 中央区
東京特別区では、都道府県+区という表記だ。
例)
東京都 中央区
これでは特別区全体を表す地域呼称が無く、変則的な感じは免れない。
では、なぜ東京特別区には市が付かないのか?
それは、1943年に戦時法制の一環として、旧東京府と旧東京市が合併したため。
東京都制(wikipedia)
現在は1都1道2府43県だが、当時は1道3府43県。
つまり、東京は府であり、区部にも市があり、東京の区は京都大阪の区と同列だった。
例)
東京府 東京市 日本橋区
確かにこれは現在の京都府京都市などと同じ住所表記だ。
この状態から、旧東京府と旧東京市が合併することになり、県レベルの次が区になってしまった。
例)
東京府 東京市 日本橋区と京橋区が合併して、「東京都 中央区」になった。
それにしても、都道府県レベルと市区町村レベルの合併というのは無理やりである。
2010年12月6日月曜日
都道府県コードと市区町村コード
都道府県には2桁、市区町村にはこれに3桁付加して計5桁のコード値が、日本工業規格(JIS)で定められている。
JIS規格
都道府県コード:JIS X 0401
市区町村コード:JIS X 0402
例)東京都千代田区 13101
"13"が東京都を示し、"101"が東京都の中では千代田区を示す。
市区町村合併や政令指定都市の区割りなどの都度、総務省によってコード値の新設廃止が行われ、常にメンテナンスされている。
コード値は以下で確認できる。
・政府の公式サイト
標準地域コードを探す(政府統計の総合窓口)
1970年以降の特定時点で存在する市区町村コードをダウンロード可能。
・総務省の公式サイトにあるリンク情報
地方公共団体コード住所(財団法人地方自治情報センターの公式サイト)
この財団は住民基本台帳ネットワークシステムの運営元である。
市区町村コード5桁にチェックデジット1桁を付加した6桁のコード値になっている。
・個人のサイト
市町村コード一覧表(イッシー氏のサイト)
非公式ながら非常によくまとまっている。過去の廃止分も載っている。私個人としては最もお薦めのサイト。
JIS規格
都道府県コード:JIS X 0401
市区町村コード:JIS X 0402
例)東京都千代田区 13101
"13"が東京都を示し、"101"が東京都の中では千代田区を示す。
市区町村合併や政令指定都市の区割りなどの都度、総務省によってコード値の新設廃止が行われ、常にメンテナンスされている。
コード値は以下で確認できる。
・政府の公式サイト
標準地域コードを探す(政府統計の総合窓口)
1970年以降の特定時点で存在する市区町村コードをダウンロード可能。
・総務省の公式サイトにあるリンク情報
地方公共団体コード住所(財団法人地方自治情報センターの公式サイト)
この財団は住民基本台帳ネットワークシステムの運営元である。
市区町村コード5桁にチェックデジット1桁を付加した6桁のコード値になっている。
・個人のサイト
市町村コード一覧表(イッシー氏のサイト)
非公式ながら非常によくまとまっている。過去の廃止分も載っている。私個人としては最もお薦めのサイト。
2010年12月5日日曜日
pythonでフォルダ内のファイル数取得
覚え書き。
# -*- coding: shift_jis -*-
#
import os,sys
def GetFileNum(sInFdr):
"""ファイル数取得
Args:
sInFdr:入力フォルダ
Returns:
ファイル数
"""
if not os.path.isdir(sInFdr): return 0
i=0
for root, dirs, files in os.walk(sInFdr):
i+=len(files)
return i
if __name__=="__main__":
sInFdr=sys.argv[1]
print GetFileNum(sInFdr)
# -*- coding: shift_jis -*-
#
import os,sys
def GetFileNum(sInFdr):
"""ファイル数取得
Args:
sInFdr:入力フォルダ
Returns:
ファイル数
"""
if not os.path.isdir(sInFdr): return 0
i=0
for root, dirs, files in os.walk(sInFdr):
i+=len(files)
return i
if __name__=="__main__":
sInFdr=sys.argv[1]
print GetFileNum(sInFdr)
2010年12月4日土曜日
2010年の県境変更(2)
2010年で最も広い面積の県境変更は、2010.03.01の群馬県太田市と埼玉県深谷市の間の変更である。
南前小屋地区は埼玉県深谷市になります。(太田市公式サイト)
南前小屋地区が深谷市へ(深谷市公式サイト) ※pdfファイル
群馬県太田市 → 埼玉県深谷市 : 約1,196,000 m2 140人
埼玉県深谷市 → 群馬県太田市 : 約 362,000 m2 0人(ゴルフ場など)
場所はこのあたり。利根川の流路に従って県境を決めた後、洪水で流路が変わり、大正時代に現在の流路になってから久しく、やっとこの度、県境変更になったとのこと。(深谷市公式サイトより)
中央にかかる橋の東側で利根川の南側部分が南前小屋地区。
大きな地図で見る
南前小屋地区は埼玉県深谷市になります。(太田市公式サイト)
南前小屋地区が深谷市へ(深谷市公式サイト) ※pdfファイル
群馬県太田市 → 埼玉県深谷市 : 約1,196,000 m2 140人
埼玉県深谷市 → 群馬県太田市 : 約 362,000 m2 0人(ゴルフ場など)
場所はこのあたり。利根川の流路に従って県境を決めた後、洪水で流路が変わり、大正時代に現在の流路になってから久しく、やっとこの度、県境変更になったとのこと。(深谷市公式サイトより)
中央にかかる橋の東側で利根川の南側部分が南前小屋地区。
大きな地図で見る
2010年12月2日木曜日
2010年の県境変更(1)
昨日(2010.12.01)、都県境の変更があった。
東京都町田市と神奈川県相模原市の間である。
この2市の間を流れる境川(武蔵国と相模国の国境)を挟んで、昔の流路の基づいて複雑に入り組んでいた都県境を、現在の流路に合わせて、上鶴間から淵野辺にかけての2km程にわたり交換しそれぞれ編入した。
行政境界の変更(相模原市公式サイト)
町田市と相模原市との境界変更(町田市公式サイト)
面積は
東京都町田市 → 神奈川県相模原市南区 : 約10500 m2
神奈川県相模原市南区 → 東京都町田市 : 約16900 m2
東京都がほんの僅か広くなった。
でも、2010年前半にはもっと広い面積の県境変更があった。
またの機会に書く予定。
東京都町田市と神奈川県相模原市の間である。
この2市の間を流れる境川(武蔵国と相模国の国境)を挟んで、昔の流路の基づいて複雑に入り組んでいた都県境を、現在の流路に合わせて、上鶴間から淵野辺にかけての2km程にわたり交換しそれぞれ編入した。
行政境界の変更(相模原市公式サイト)
町田市と相模原市との境界変更(町田市公式サイト)
面積は
東京都町田市 → 神奈川県相模原市南区 : 約10500 m2
神奈川県相模原市南区 → 東京都町田市 : 約16900 m2
東京都がほんの僅か広くなった。
でも、2010年前半にはもっと広い面積の県境変更があった。
またの機会に書く予定。
2010年11月27日土曜日
都道府県市区町村名の表記(1)
都道府県市区町村名とは、住所構造のうち大字より前の部分、と定義しておく。
表記パターンは5つ。
1.都道府県+市+区
政令指定都市。
例)北海道 札幌市 中央区
2.都道府県+市
上記1以外の市。
例)大阪府 東大阪市
3.都道府県+区
特別区。
例)東京都 千代田区
4.都道府県+町村
東京都の島嶼部の町村。
例)東京都 八丈町
5.都道府県+郡+町村
上記4以外の町村。
例)岡山県 真庭郡 新庄村
表記パターンは5つ。
1.都道府県+市+区
政令指定都市。
例)北海道 札幌市 中央区
2.都道府県+市
上記1以外の市。
例)大阪府 東大阪市
3.都道府県+区
特別区。
例)東京都 千代田区
4.都道府県+町村
東京都の島嶼部の町村。
例)東京都 八丈町
5.都道府県+郡+町村
上記4以外の町村。
例)岡山県 真庭郡 新庄村
2010年11月24日水曜日
pythonでフォルダ容量取得
覚え書き。
# -*- coding: shift_jis -*-
#
import os,sys
def GetFdrSize(sInFdr):
"""フォルダ容量取得
Args:
sInFdr=入力フォルダ
Returns:
フォルダ容量(バイト)
"""
if not os.path.isdir(sInFdr): return 0
i=0
for root, dirs, files in os.walk(sInFdr):
for file in files:
i+=os.path.getsize(os.path.join(root, file))
return i
if __name__=='__main__':
sInFdr=sys.argv[1]
print GetFdrSize(sInFdr)
# -*- coding: shift_jis -*-
#
import os,sys
def GetFdrSize(sInFdr):
"""フォルダ容量取得
Args:
sInFdr=入力フォルダ
Returns:
フォルダ容量(バイト)
"""
if not os.path.isdir(sInFdr): return 0
i=0
for root, dirs, files in os.walk(sInFdr):
for file in files:
i+=os.path.getsize(os.path.join(root, file))
return i
if __name__=='__main__':
sInFdr=sys.argv[1]
print GetFdrSize(sInFdr)
pythonでwaveファイル(2)
サンプリングレートとは、アナログ情報をデジタル化する際に1秒間に取得するデータの数。そして、音データはこうして取得した音圧レベルの数値を羅列したもの。
波形データは以下のようになっているとのこと。
何か難しいデータ項目を何種類も持っているのではないか予想をしていたのだが、見事に裏切られ、「音圧レベル」という値を羅列しているだけらしい。
しかもステレオ音声でも-32768 ~ +32767。
これは16bit、2バイトだから、00~FFまでの16進数、半角アルファベット2文字で取得データ1個分というわけ。
これで、音の大きさ、高さ、音色が全部記録できるのかな? と思ったので、さらにネット検索を続けつつ考えてみた。
(参考)
WAV ファイルフォーマット(近藤正芳氏のウェブサイト)
おとなバンド「健康」のムリムリ活動報告 音響豆知識(boo*a*ken*o氏のブログ)
PCM の基本
他、wikipediaなど多数のサイト。
そして自分なりの結論に達した。なにぶん素人なので大雑把で感覚的な話になるが、
・「音圧レベル」の数値だけで、音のすべての要素を記録可。(限界はあるが)
・音の強さは、値の大小で表現。波形データの振幅。大きな値でドーンとくれば大きな音。
・音の高さは、複数の音圧レベルデータで構成される音の波の周期で表現。短周期(高周波数)が高音。波形が激しく上下すれば高音。
・音色は、数値データが形づくる波の重なり具合。波形が複数合成された形状の様子が音色を意味する。
確かに、音が耳に入ってくるときは空気の振動が耳の鼓膜を振動させるだけなので、音の圧力レベルの値の羅列によって、音のすべての要素が記録できるというのは、耳と同じことをやってるということで、確かにそうかもしれないと直感的に思った。
音データ関係は全くの素人なので驚きの連続であった。
音量を調整したいのが目的なので、まずは状況確認としてwave.pyで取得できる値を見てみた。
# -*- coding: shift_jis -*-
#wavCheck.py
#
import os,sys,struct,math,wave
def wav_MaxVol(sIn):
"""waveファイル情報を取得する。
Args:
sIn:入力ファイル
Returns:
オーディオチャンネル数
サンプルサイズ(バイト)
サンプリングレート
サンプリングレート
音データの最大値
音データの最小値
"""
#wavファイル以外は処理対象外
xx, ext=os.path.splitext(sIn)
if ext.upper()!=".WAV": return None
oIn=wave.open(sIn.decode("sjis"))
#オーディオチャンネル数(モノラルなら1、ステレオなら2)
nchannels=oIn.getnchannels()
#サンプルサイズ(バイト)
sampwidth=oIn.getsampwidth()
#サンプリングレート
framerate=oIn.getframerate()
#オーディオフレーム数
nframes=oIn.getnframes()
#オーディオフレーム(リストオブジェクト)
frames=oIn.readframes(nframes)
oIn.close()
#波形データの最大最小値を取得
Lx=[];Ln=[]
for i in range(nframes): #フレーム数までのループ
for j in range(nchannels): #フレーム中のチャネル数までのループ
c=(frames[i+j*nchannels]+frames[i+j*nchannels+1])
#文字→数値
Lx.append(struct.unpack("<h", c)[0])
Ln.append(struct.unpack("<h", c)[0])
#最大最小を残す
Lx=[max(Lx)]
Ln=[min(Ln)]
#曲全体の最大値
Lmax=Lx[0]
Lmin=Ln[0]
#音圧レベル(デシベル)
#MaxdB=20*(math.log(float(Lmax))-math.log(32767.0))
#MindB=20*(math.log(float(Lmin))-math.log(32767.0))
#取得値の確認
return nchannels,sampwidth,framerate,nframes,Lmin,Lmax
if __name__=='__main__':
sInFdr=sys.argv[1]
for root, dirs, files in os.walk(sInFdr):
for file in files:
sIn=os.path.join(root, file)
nchannels,sampwidth,framerate,nframes,Lmin,Lmax = wav_MaxVol(sIn)
print os.path.basename(sIn), \
nchannels,sampwidth,framerate,nframes,Lmin,Lmax
上記のpythonソースwavCheck.pyとして保存し、バッチファイルで引数にwaveファイルの入っているフォルダを指定して実行してみた。
wavCheck.py C:\・・・
すると、音量の丁度いいaaa.wavも、音量が小さくて調整したいbbb.wavもフレーム数以外は同じ値が返ってきた。
aaa.wav 2 2 44100 9999999 -32768 32767
bbb.wav 2 2 44100 8888888 -32768 32767
えっ?と思いつつ、今日はここまで。
波形データは以下のようになっているとのこと。
・8bit または 16bit PCM データが時間順に記録されています。えっ、そうなの?
・ステレオならば L R L R L R … の順番
・数値の並べ型は Intel バイトオーダ
・ビット数は 8bit と 16bit
8bit ならば符号無し unsigned (0 ~ 255, 無音は 128)
16bit ならば符号付き signed (-32768 ~ +32767, 無音は 0)
何か難しいデータ項目を何種類も持っているのではないか予想をしていたのだが、見事に裏切られ、「音圧レベル」という値を羅列しているだけらしい。
しかもステレオ音声でも-32768 ~ +32767。
これは16bit、2バイトだから、00~FFまでの16進数、半角アルファベット2文字で取得データ1個分というわけ。
これで、音の大きさ、高さ、音色が全部記録できるのかな? と思ったので、さらにネット検索を続けつつ考えてみた。
(参考)
WAV ファイルフォーマット(近藤正芳氏のウェブサイト)
おとなバンド「健康」のムリムリ活動報告 音響豆知識(boo*a*ken*o氏のブログ)
PCM の基本
他、wikipediaなど多数のサイト。
そして自分なりの結論に達した。なにぶん素人なので大雑把で感覚的な話になるが、
・「音圧レベル」の数値だけで、音のすべての要素を記録可。(限界はあるが)
・音の強さは、値の大小で表現。波形データの振幅。大きな値でドーンとくれば大きな音。
・音の高さは、複数の音圧レベルデータで構成される音の波の周期で表現。短周期(高周波数)が高音。波形が激しく上下すれば高音。
・音色は、数値データが形づくる波の重なり具合。波形が複数合成された形状の様子が音色を意味する。
確かに、音が耳に入ってくるときは空気の振動が耳の鼓膜を振動させるだけなので、音の圧力レベルの値の羅列によって、音のすべての要素が記録できるというのは、耳と同じことをやってるということで、確かにそうかもしれないと直感的に思った。
音データ関係は全くの素人なので驚きの連続であった。
音量を調整したいのが目的なので、まずは状況確認としてwave.pyで取得できる値を見てみた。
# -*- coding: shift_jis -*-
#wavCheck.py
#
import os,sys,struct,math,wave
def wav_MaxVol(sIn):
"""waveファイル情報を取得する。
Args:
sIn:入力ファイル
Returns:
オーディオチャンネル数
サンプルサイズ(バイト)
サンプリングレート
サンプリングレート
音データの最大値
音データの最小値
"""
#wavファイル以外は処理対象外
xx, ext=os.path.splitext(sIn)
if ext.upper()!=".WAV": return None
oIn=wave.open(sIn.decode("sjis"))
#オーディオチャンネル数(モノラルなら1、ステレオなら2)
nchannels=oIn.getnchannels()
#サンプルサイズ(バイト)
sampwidth=oIn.getsampwidth()
#サンプリングレート
framerate=oIn.getframerate()
#オーディオフレーム数
nframes=oIn.getnframes()
#オーディオフレーム(リストオブジェクト)
frames=oIn.readframes(nframes)
oIn.close()
#波形データの最大最小値を取得
Lx=[];Ln=[]
for i in range(nframes): #フレーム数までのループ
for j in range(nchannels): #フレーム中のチャネル数までのループ
c=(frames[i+j*nchannels]+frames[i+j*nchannels+1])
#文字→数値
Lx.append(struct.unpack("<h", c)[0])
Ln.append(struct.unpack("<h", c)[0])
#最大最小を残す
Lx=[max(Lx)]
Ln=[min(Ln)]
#曲全体の最大値
Lmax=Lx[0]
Lmin=Ln[0]
#音圧レベル(デシベル)
#MaxdB=20*(math.log(float(Lmax))-math.log(32767.0))
#MindB=20*(math.log(float(Lmin))-math.log(32767.0))
#取得値の確認
return nchannels,sampwidth,framerate,nframes,Lmin,Lmax
if __name__=='__main__':
sInFdr=sys.argv[1]
for root, dirs, files in os.walk(sInFdr):
for file in files:
sIn=os.path.join(root, file)
nchannels,sampwidth,framerate,nframes,Lmin,Lmax = wav_MaxVol(sIn)
print os.path.basename(sIn), \
nchannels,sampwidth,framerate,nframes,Lmin,Lmax
上記のpythonソースwavCheck.pyとして保存し、バッチファイルで引数にwaveファイルの入っているフォルダを指定して実行してみた。
wavCheck.py C:\・・・
すると、音量の丁度いいaaa.wavも、音量が小さくて調整したいbbb.wavもフレーム数以外は同じ値が返ってきた。
aaa.wav 2 2 44100 9999999 -32768 32767
bbb.wav 2 2 44100 8888888 -32768 32767
えっ?と思いつつ、今日はここまで。
2010年11月23日火曜日
pythonでwaveファイル(1)
ユーチューブでダウンロードした音楽ファイル(wavファイル)の音量にばらつきがあって、運転中に音量を上げたり下げたりするのが面倒だと前から思っていた。
そこでフリーソフトを探してみたところ、1曲ずつ調整するとか、指定したフォルダ内で同じにするとかならばあったのだが・・・。一曲ずつじゃ面倒だし、前回調整分と今回調整分で音量が違ってもイヤだし。例えば温度なら25度みたいな、絶対的な音量に揃えるというようなソフトは、探した限りでは見つからなかった。
ならば、pythonで調整するぞ! ということで、wave.pyを使ってみることにする。
19.5 wave -- WAVファイルの読み書き (python2.5 公式サイト)
オープンすると、 Wave_read オブジェクトが取得できて、と、ここでつまずいた。
サンプリングレートって何?
音響学の基礎がわかっていないので、音響関係の業界用語についていけない。
まず基本的なことから調べてみる。
まず、wavファイルの定義はこれ。
WAV ファイルフォーマット(近藤正芳氏のウェブサイト)
そこでフリーソフトを探してみたところ、1曲ずつ調整するとか、指定したフォルダ内で同じにするとかならばあったのだが・・・。一曲ずつじゃ面倒だし、前回調整分と今回調整分で音量が違ってもイヤだし。例えば温度なら25度みたいな、絶対的な音量に揃えるというようなソフトは、探した限りでは見つからなかった。
ならば、pythonで調整するぞ! ということで、wave.pyを使ってみることにする。
19.5 wave -- WAVファイルの読み書き (python2.5 公式サイト)
オープンすると、 Wave_read オブジェクトが取得できて、と、ここでつまずいた。
サンプリングレートって何?
音響学の基礎がわかっていないので、音響関係の業界用語についていけない。
まず基本的なことから調べてみる。
まず、wavファイルの定義はこれ。
WAV ファイルフォーマット(近藤正芳氏のウェブサイト)
2010年11月21日日曜日
登録:
投稿 (Atom)