Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Співаючий пітон

with 9 comments

Пітон - музикант

Якось так повелось, що і до музики я не байдужий. Навіть недавно спробував зіграти на гітарі 8 перших нот Memmingen Річчі Блекмора.

        
E||--------------0h-2--|--3-----2h3h2h0-----------|--0----------------|
B||--------------------|-----0----------3---------|--1----------------|
G||--------------------|---------------------0----|--0----------------|
D||--------------------|--2-----------------------|--2----------------|
A||--------------------|----------------2---------|--3----------------|
E||--------------------|--------------------------|-------------------|

Хоча грав я це без ефекту h[ummer] (пальці більше звикли до м’яких постукувань по клавіатурі, ніж до різких та сильних по струні.

А ще постійно хочеться навчитись грати на сопілці, бо вона порівняно з гітарою набагато компактніша. І на сопілці грає менша кількість людей ніж на гітарі. І крім того розвиває дихалку.

Але давайте повернемось до справи

Програміст все може зробити на комп’ютері. Мене завжди дивувала відсутність програм, які роблять з клавіатури піаніно. Чи орган. Більшість створена для музикантів, і вимагає наявності midi-клавіатури. Але мені було б легше грати на qwerty, яку не потрібно купляти, і я вже освоїв.

Тому, я трохи погуглив, і знайшов простий модуль для python, який може виводити звук. Називається pyaudiere. На сайті є .deb – пакет, але в нього трохи криві залежності. Це падло вчора встановило мені python2.5. І я не знаю як перенести файли в python2.6, чи виправити залежності.

Тому, приходиться працювати з python2.5, в якому я на щастя не помітив видимих відмінностей від наступної версії.

Але ноти мають мати тривалість. А найлегше керувати тривалістю звучання прив’язавши її до тривалості натиснення клавіші. А найкращий цикл обробки подій клавіатури я знайшов у бібліотеці pygame.

#!/usr/bin/env python 
import audiere

device = audiere.open_device()# Пробуємо отримати доступ до аудіовиходу

gamma = { "C":261.63, "C#":277.18, "D":293.66, "D#":311.13, "E":329.63, "F":349.23, "F#":369.99, "G":392, "G#":415.3, "A":440, "A#":466.16, "B":493.88 }
# Які частоти відповідають яким нотам
keyboard = { u'a':"C", u's':"C#", u'd':"D", u'f':"D#", u'g':"E", u'h':"F", u'j':"F#", u'k':"G", u'l':"G#", u';':"A", u'\'':"A#", u'\r':"B", u'q':"2C", u'w':"2C#", u'e':"2D", u'r':"2D#", u't':"2E", u'y':"2F", u'u':"2F#", u'i':"2G", u'o':"2G#", u'p':"2A", u'[':"2A#", u']':"2B"  }
#А це - які кнопки відповідають яким нотам.

strings = {}# Тут будуть зберігатись струни (тони). Для кожної кнопки будемо створювати свій, тому можна грати акорди.
def note(sim):
	""" За символьним заданням ноти наприклад 2G# , отримати її тон."""
	print sim
	scale=1
	if sim[0]=='2':
		scale=2	
		sim=sim[1:]
	return device.create_tone(gamma[sim]*scale)
	

import pygame,sys
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480)) #Ну, йому потрібне вікно яке буде отримувати події клавіатури. Хоча вивід я все одно роблю в консоль.
pygame.display.set_caption('Piano simulator')

done = False
while not done: 
	for event in pygame.event.get(): #Поїхали
		if (event.type == KEYUP): # Ми відпустили кнопку
			print 'up'
			if event.key in strings:
				strings[event.key].pause() # Припиняємо звук
			if (event.key == K_ESCAPE): # Якщо esc - стараємось вийти
				done = True
				sys.exit(0)
		if (event.type == KEYDOWN): # Якщо ми натискаємо кнопку
			if (event.unicode in keyboard):
				strings[event.key] = note(keyboard[event.unicode]) # То дивимось яка нота до неї прив'язана
				strings[event.key].play() # І починаємо її грати

Хотів написати це набагато раніше, але на факультеті були сильні проблеми з інтернетом. І наступні публікації теж будуть рідшими, бо наближається свято.

Advertisements

Written by bunyk

Грудень 10, 2009 at 12:59

Оприлюднено в Кодерство

Tagged with , ,

Відповідей: 9

Subscribe to comments with RSS.

  1. Дивне співпадіння! Мемінгем – перша пісня, яку я навчився грати на гітарі!

    Хочу тепер трошки покритикувати ноти. Де ти взяв таку відстійну інтерпретацію?? Ось як правильно грається:

    Як бачиш, одним ефектом h[ummer] тут не обежешся. Тому МІДІ-подібне звучання твоєї програми просто напросто руйнує красу пісні. Ось приклад більш потужної генерації правильних звуків:

    Тут присутнє legato, що є достатнім для нормального звучання мелодії. Не кажучи уже про те, що в Guitar Pro ноти звучать як гітарні, а у тебе – як писк.

    Щодо програми – десь я уже бачив її реалізацію, щоправда, на паскалі ))) Якщо є бажання – можеш зробити НАБАГАТО більш корисну програму, яка аналізує спектр гітарного сигналу і виводить частоти, які найбільш часто зустрічаються в певному проміжку. Скріншот такої програми:

    Як видно, виділивши по слуху ноту, програма автоматично будує її спектр і дозволяє визначити, які саме ноти на грифі гітари граються на даній частині пісні. (До-речі, сам Річі грає пісню не по нотам – він змістив її в іншу тональність, тому замість фрагменту
    E||-----------|-
    B||-3---------|-
    G||------0----|-
    D||-----------|-
    A||-2---------|-
    E||-----------|-

    грає
    E||-0---------|-
    B||-----------|-
    G||------2----|-
    D||-----------|-
    A||-4---------|-
    E||-----------|- )

    Єдиний недолік Транскрайбу – вона платна. Можеш зробити її фріверну версію – така програма згодиться всім музикантам.

    ps. Хоч в твоїй програмі і є недоліки, але хвалю, молодець!

    danbst

    Грудень 10, 2009 at 14:12

    • тупий вордпрес… мало того, що немає попереднього перегляду, щей не можна редагувати коментарі….
      такс..

      danbst

      Грудень 10, 2009 at 14:19

      • подумав, подумав…


        E||-----------|-
        B||-3---------|-
        G||------0----|-
        D||-----------|-
        A||-2---------|-
        E||-----------|-
        грає
        E||-0---------|-
        B||-----------|-
        G||------2----|-
        D||-----------|-
        A||-4---------|-
        E||-----------|-
        або
        F#||-----------|-
        C#||-3---------|-
        A ||------0----|-
        E ||-----------|-
        B ||-2---------|-
        F#||-----------|-

        тобто, він грає по нотах, але на гітарі у нього струни натягнуті сильніше, не по стандарту

        danbst

        Грудень 10, 2009 at 14:54

        • Це ти про Блекмора? Бо я щось не дуже зрозумів.

          bunyk

          Грудень 10, 2009 at 16:39

          • так-так, про Блекмора. В mp3-шці звучання пісні йде вищим на тон, тобто замість мі він грає фа-дієз (перша нота пісні).

            >>>Я взагалі за запис мелодії як D# 1/2, 2A 1/8, A 1/4 (ну, якось в цьому роді).
            Ну, якби ти почув Мемінгем у такому звучанні – так пісня тобі би не сподобалась. Наявність великої кількості прийомів так званого “офарбовування” музики потребує не меншої кількості різних знаків.

            >>>А ця програмка не для гітари, а як реінкарнація тієї програмки на turbo pascal. Звісно вона має трохи більші можливості.
            тоді вся критика відпадає, це все пояснює )))

            danbst

            Грудень 10, 2009 at 17:31

      • Що маємо те маємо… Всеодно краще ніж ЖЖ.

        bunyk

        Грудень 10, 2009 at 16:28

    • Як такі ноти взагалі читаються? О_о

      Я взагалі за запис мелодії як D# 1/2, 2A 1/8, A 1/4 (ну, якось в цьому роді).

      А ця програмка не для гітари, а як реінкарнація тієї програмки на turbo pascal. Звісно вона має трохи більші можливості.

      bunyk

      Грудень 10, 2009 at 16:34

      • >>>Я взагалі за запис мелодії як D# 1/2, 2A 1/8, A 1/4
        ти, я бачу, з тих людей у яких алфавіт обмежений 256 символами. пора уже вийти з полону клавіатури і записувати мелодію у тому алфавіті, який більше для цього підходить. а ось реалізацію “музичного алфавіту” можеш робити і за допомогою ASCII

        danbst

        Грудень 10, 2009 at 17:42

  2. підправити залежності у готовій дебці можна легко. я роблю так:
    1. у міднайткомандері заходжу у деб-файл. там буде видно:
    CONTENT
    DEBIAN
    INFO
    INSTALL
    у окрему директорію, наприклад new_dir копіюєш вміст CONTENT і всю DEBIAN, тобто ls new_dir має видати:
    usr etc (якщо є) bla-bla-bla DEBIAN
    2. Є файл DEBIAN/control, у ньому виписані залежності. Прав як тобі треба. Ще там є сусідній файл, він зайвий. (хоча можна було і не копіювати, і відтак не знищувати)
    3. вийшовши у материнську директорію відносно new_dir виконай:
    сhmod -R 755 new_dir
    dpkg -b new_dir
    матимеш новий пакет new_dir.deb, який ти знаєш, як встановити.

    verdakafo

    Грудень 12, 2009 at 01:16


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: