Співаючий пітон
Якось так повелось, що і до музики я не байдужий. Навіть недавно спробував зіграти на гітарі 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() # І починаємо її грати
Хотів написати це набагато раніше, але на факультеті були сильні проблеми з інтернетом. І наступні публікації теж будуть рідшими, бо наближається свято.
Дивне співпадіння! Мемінгем – перша пісня, яку я навчився грати на гітарі!
Хочу тепер трошки покритикувати ноти. Де ти взяв таку відстійну інтерпретацію?? Ось як правильно грається:

Як бачиш, одним ефектом 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
підправити залежності у готовій дебці можна легко. я роблю так:
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