Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Piano on-perl

778 views

Published on

(In Russian)

Descript

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Piano on-perl

  1. 1. Piанино на Perl: немного кода и немного музыки Александр Котов
  2. 2. ”YAPC::Europe 2011” в Риге
  3. 3. Домский собор в Риге
  4. 4. Пианино. Perl. Идея. <ul><li>Эмулятор клавишного музыкального инструмента клавиатурой ноутбука </li></ul><ul><li>Это должен быть скрипт на Perl ... </li></ul><ul><li>... простой ... </li></ul><ul><li>... очень простой скрипт!!! </li></ul><ul><li>Нажимаем кнопку – получаем звук: </li></ul><ul><ul><li><1> : До </li></ul></ul><ul><ul><li><2> : Ре </li></ul></ul><ul><ul><li>... </li></ul></ul>
  5. 5. <ul><li>Нетбук + MS Windows XP + Active State Perl </li></ul><ul><li>Для генерации звуков используем MIDI-библиотеку Win32::MIDI: </li></ul><ul><ul><li>к сожалению, платформозависимую... </li></ul></ul><ul><ul><li>скачиваем и ставим её через ActiveState PPM </li></ul></ul><ul><li>Привязываем клавиши к номерам звуков: До - Ре - Ми - Фа - Соль - Ля - Си - До - Ре - Ми $note = { 1 => 60 , 2 => 62 , 3 => 64 , 4 => 65 , 5 => 67 , 6 => 69 , 7 => 71 , 8 => 72 , 9 => 74 , 0 => 76 }; </li></ul>Пианино. Perl. Проект.
  6. 6. Рига. ЖЖЁМ!
  7. 7. Как читать символы с клавиатуры на Perl?! <ul><li>Есть стандартная (!) функция языка getc </li></ul><ul><li>Вы что-нибудь про неё слышали?! </li></ul>
  8. 8. ”getc” ?! – не для MS Win ... пичалька
  9. 9. Term::ReadKey ... в общем, делаем так: <ul><li>use Term::ReadKey ; </li></ul><ul><li>... </li></ul><ul><li>ReadMode 4 ; # Turn off controls keys </li></ul><ul><li>while ( 1 ) { </li></ul><ul><li>while ( not defined ( $key = ReadKey(- 1 ))) { } </li></ul><ul><li>if ( $key =~ / ^[ 0-9 ]$ / ) { </li></ul><ul><li>print &quot; Key $key - note $note -> { $key } n &quot;; </li></ul><ul><li># TODO: Play MIDI note </li></ul><ul><li>} else { last; } # Exit on other key </li></ul><ul><li>} </li></ul><ul><li>ReadMode 0 ; </li></ul>
  10. 10. Win32::MIDI <ul><li>use Win32::MIDI ; </li></ul><ul><li>... </li></ul><ul><li># Init MIDI </li></ul><ul><li>my $midi_obj = Win32::MIDI ->new(); </li></ul><ul><li>$midi_obj -> openDevice ( 0 ); </li></ul><ul><li>$midi_obj -> cur_channel ( 1 ); </li></ul><ul><li>... </li></ul><ul><li>$midi_obj -> play_note ( $note ->{ $key }, 0.125 , 127 , 0 ) || </li></ul><ul><li>print $midi_obj -> error () . &quot; n &quot; and </li></ul><ul><li>$midi_obj -> reset_error (); </li></ul>
  11. 11. Live DEMO <ul><li>Код программы (<F3>) - каких-то 700 байт!!! (и полчаса работы) </li></ul><ul><li>Запускаем! </li></ul><ul><li>Test (случайные кнопки) </li></ul><ul><li>Новогодний микс: </li></ul><ul><ul><li>”Jingle Bells” </li></ul></ul><ul><ul><li>”We Wish You” </li></ul></ul><ul><ul><li>”В лесу родилась елочка” </li></ul></ul>

×