あなたの「耳年齢」測ります


ご存知の方も多いと思いますが、「モスキート音」というのがあります。

何年か前、テレビでやっていました。
年を取るほど高音は聞き取れなくなるので、
蚊の羽音のような高い音は、オヤジは気にならないが、聞こえる若者にはすごく耳障り。
といった代物です。


wikipedia - モスキート音


思いつきで、高音を聞き取れるかどうか、テストするアプリをPythonで作ってみました。



GUIライブラリはTkinterを使いました。


今回はごく小さいので何とかなりますが、ウィンドウデザイナがないとやっぱりキツイか?



なおwinsound.Beepで出す関係上、Windows以外で動くかはわかりません。
beepコマンドを入れれば動くはずですが、試してません(Winしか持ってません)。

#encoding:utf-8
from __future__ import (
    with_statement, 
    division,
    print_function,
)

import os
import sys
from functools import partial

from Tkinter import *
from tkFont import *
import webbrowser

author  = u"doloop"
Webpage = u"http://doloopwhile.blogspot.com/"


try:
    import winsound
except ImportError:
    import subprocess
    def beepsound(frequency, duration):
        #apt-get install beep
        subprocess.call("beep -f {0} -l {1}".format(frequency, duration))
else:
    def beepsound(frequency, duration):
        winsound.Beep(frequency, duration)

class MainFrame(Frame):
    def __init__(self, *a, **kw):
        Frame.__init__(self, *a, **kw)
        
        self.duration_var = IntVar(self, 1000)
        
        beep_panel = LabelFrame(self, text=u"Beep the PC’s speaker(Hz).")
        beep_panel.pack()
        
        self.beep_buttons = []
        buttons = Frame(beep_panel)
        for freq in xrange(1000, 20000 + 1, 1000):
            row    = (freq - 1000) // 5000
            column = (freq - 1000) %  5000
            
            text = unicode(freq).center(5)
            btn = Button(buttons, 
                text=text,
                command=partial(self.beep, freq)
            )
            btn.grid(row=row, column=column, sticky=N+S+W+E)
        buttons.pack()
        
        dur_panel = LabelFrame(self, text=u"duration of sound(milliseconds).")
        dur_panel.pack()
        
        dur_scale = Scale(
            dur_panel, 
            orient=HORIZONTAL,
            from_=0,
            to=2000,
            resolution=100,
            tickinterval=500,
            variable=self.duration_var
        )
        dur_scale.pack(fill=BOTH)
        
        url_label = Label(
            self,
            cursor="hand2",
            fg="blue",
            text="{0}({1})".format(author, Webpage),
            takefocus=True,
        )
        
        font = Font(font=url_label["font"])
        font["underline"] = True
        url_label["font"] = font
        url_label.bind('<Button-1>', self.on_url_clicked)
        
        url_label.pack()
    
    def on_url_clicked(self, event):
        webbrowser.open(Webpage)
    
    def beep(self, freq):
        beepsound(freq, self.duration_var.get())
    
def main():
    root &#061; Tk()
    for freq in xrange(1000, 20000 + 1, 1000):
        beepsound(freq, 100)
    root.title(os.path.basename(sys.argv[0]))
    f &#061; MainFrame(root)
    f.pack()
    root.mainloop()

if __name__ &#061;&#061; "__main__":
    main()


素直に白状すると、ここの同様のソフトのパクリです。