Или «Как программировать людей»

«Искусство - это просто бесконечно более занимательная форма математики». - Я

Вы когда-нибудь хотели запрограммировать людей? Что ж, оказывается, можно. И нет, я не говорю о каком-то контроле над разумом, телепатии или гипнозе. Я говорю о музыке - в частности, о нотах или нотах. Фактически, для опытного музыкального интерпретатора (т.е. музыканта) страница с музыкой - это код, который можно выполнить для создания или воспроизведения серии последовательных и параллельных звуковых частот в манера, задуманная первоначальным создателем (например, музыка).

Попробуйте этот небольшой эксперимент со своими музыкально настроенными друзьями. (Если у вас нет друзей с музыкальными наклонностями, найдите их, обычно мы не кусаемся). Возьмите эту пьесу Моцарта и поставьте перед ними, не рассказывая, что это такое. Посмотрите, не начнут ли они напевать мелодию. Возможно, они даже смогут распознать это только по заметкам! Для протокола: когда я начал читать, я мог слышать музыку в своей голове, просто глядя на первые две строчки. Для музыканта достаточно просто взглянуть на ноты, чтобы начать работу с нашим музыкальным переводчиком.

Сейчас я хочу показать, что существует еще несколько параллелей между музыкой и кодированием, и что, возможно, музыка сама по себе язык программирования для людей.

Небольшое примечание…

Я намерен сделать эту статью доступной как можно большему количеству людей. Хотя я постараюсь поддерживать программирование и теорию музыки на высоком уровне, некоторые из них будут касаться некоторых хардкорных теорий музыки и шаблонов программирования. Обычно я использую Python 3 в качестве основного языка из-за его полезности, повсеместности, удобочитаемости и потому, что я его хорошо знаю. Обычно я буду говорить о музыке с точки зрения клавишника (моя степень бакалавра - исполнение на органной трубе).

Языки программирования

Начнем с языков программирования. Как вы знаете, есть много языков для программирования - некоторые компилируются, некоторые интерпретируются, но в конечном итоге код запускается на компьютере. Некоторые современные популярные языки включают Javascript, Python, Go, C ++ и т. Д. Хотя каждый язык имеет свои сильные и слабые стороны, идиомы и синтаксис, все они имеют определенные общие черты:

  • У каждого языка есть определенные задачи, в которых он преуспевает, а некоторые - нет.
  • Каждый язык выполнен немного по-своему.
  • У каждого языка есть опытные практики, которые не обязательно знают другие языки.
  • Для человека, имеющего прочный фундамент в программировании, выучить новый язык легче, чем для человека, который никогда раньше не программировал.

Теперь позвольте мне предложить кое-что - музыкальные инструменты - это языки программирования в мире музыки.

«Но музыка есть музыка», - скажете вы! Как разные музыкальные инструменты образуют параллель с языками программирования? Давайте посмотрим, как играют и записываются ноты на двух разных музыкальных инструментах - фортепиано и трубе.

Фортепиано

На пианино играют руками и ногами. Пальцы нажимают разные комбинации клавиш, а ноги нажимают на различные педали (в первую очередь, на демпферную педаль, хотя всего педалей три) на фортепиано. Умение играть на клавишах правильно, эффективно и не глядя на них - вот некоторые из навыков, которые пианист развивает, обучаясь игре на фортепиано.

Фортепианная музыка тоже обозначена особым образом. Музыка для фортепиано обычно записывается на большом посохе - это парный набор музыкальных нотоносцев, который обычно имеет как скрипичный, так и басовый ключи. Обычно ноты на скрипичном ключе играются правой рукой, а ноты на басовом ключе - левой рукой. Фортепиано может воспроизводить несколько нот одновременно, а пианист может задействовать несколько клавиш одновременно - это означает, что фортепиано полифоническое. Полифония обозначается вертикальными кластерами нот на большом нотоносце - проницательный читатель может увидеть здесь параллель между музыкальной полифонией и параллелизмом в программировании. Также есть специальные отметки, указывающие, когда нажимать или отпускать различные педали. Также следует отметить, что у фортепиано тон до C, что означает, что средняя нота C на фортепиано соответствует Concert C или ~ 261,6 Гц.

Труба

Напротив, на трубе пользователь сжимает губы в чашку в мундштуке, а затем жужжит губами, продувая через них воздух - это называется амбушюр. Ноты исполняются исполнителем, задействуя различные комбинации клапанов на трубе в дополнение к изменению количества воздуха, проходящего через губы, и силы мышц губ, сжимающих их губы вместе. Музыка трубы записана на нотоносце только со скрипичным ключом. Труба монофоническая, то есть она может воспроизводить только одну ноту за раз, поэтому для сольной игры она обозначена одной строкой нот через нотоносец. Чтобы еще больше запутать ситуацию, стандартная труба имеет тон Bb, то есть игра C на трубе приравнивается к игре на клавише Bb на пианино - это транспонирование инструмент.

***

Таким образом, вы можете видеть, что на каждом инструменте играют по-разному, они написаны по-разному и даже имеют свой собственный уникальный музыкальный и разговорный язык. Тем не менее, все они используют похожие музыкальные обозначения (ключи, линии, пробелы и т. Д.) И аналогичные конструкции, а это означает, что пианисту легче начать играть на трубе, чем не музыканту, начать играть на любом из инструментов.

Переводчик

Давайте попробуем вариант описанного выше эксперимента - найдем простой исходный код и представим его другу-программисту. Скорее всего, они могут сказать вам, что делает этот код, по крайней мере, на высоком уровне, даже если они не знают этого конкретного языка. Точно так же, как программист может читать исходный код, музыкант может читать музыку - но ничего не происходит, пока код не будет выполнен подходящим интерпретатором.

Люди - интерпретаторы музыки. Не все люди, играющие на музыкальном инструменте, умеют читать ноты - я знаю это по личному опыту - и в своем предыдущем заявлении я специально указал опытных музыкальных переводчиков. Чтение музыки - это такой же навык, как и чтение кода.

Когда мы хотим выполнить код, написанный на Python, мы выполняем его с помощью интерпретатора Python. Например, если у меня есть сценарий с именем hello.py, я бы выполнил его, набрав python hello.py в командной строке. Когда вы это делаете, интерпретатор Python читает сценарий, переводит (компилирует) сценарий в байт-код, который может быть запущен в локальной вычислительной архитектуре, выполняет этот байт-код в контексте операционной системы и архитектуры оборудования и возвращает результат.

Подобным образом музыкант исполняет ноты. Музыкант садится за пианино, перед ним играет музыка и интерпретирует ее. То есть глаза музыканта просматривают страницу, и их мозг переводит различные музыкальные символы, которые они видят, в физические действия, выполняемые их телом. В случае с клавиатурой это означает нажатие правильных клавиш или комбинации клавиш в нужное время. Это также может означать нажатие одной или нескольких педалей ногами, а также наклон к одному концу клавиатуры, чтобы дотянуться до нот на верхнем или нижнем конце клавиатуры.

Объектно-ориентированный

Многие современные языки программирования обычно считаются объектно-ориентированными, то есть все является объектом, который имеет определенные свойства. Объекты могут быть разных типов, включая строку, целое число, число с плавающей запятой, массив, словарь и т. Д. Для каждого из этих типов доступны разные методы. Например, в Python для строк доступны различные методы управления строкой, такие как upper (), lower () и т. Д. В Python также есть операторы для выполнения таких операций, как сложение, вычитание, конкатенация и т. Д.

Музыка тоже имеет похожие структуры. Можно сказать, что музыкальным эквивалентом объекта программирования является нота. Ноты в музыке имеют разное значение в зависимости от их окружения. Базовая длительность заметки определяется в зависимости от того, заполнена она или нет, а также от наличия или отсутствия основы и флажков. Целая нота - это незаполненный овал без ножки, названный так потому, что он занимает продолжительность целого такта. Целую ноту можно разделить, добавив вертикальную основу к незаполненной целой ноте, создав половинную ноту (т. Е. половину всей ноты). Квартальная нота - это заполненный овал со стержнем. Квартальную ноту можно дополнительно разделить, добавив к ней флаги, создав восьмую ноту (один флаг), шестнадцатую ноту (два флага) и так далее. Здесь вы заметите еще одну закономерность - длительность, основанную на степени двойки.

К заметке также могут применяться другие эффекты в индивидуальном порядке. Например, добавление точки справа от примечания добавляет половину продолжительности примечания, к которому оно прикреплено, к продолжительности этой примечания - например, пунктирная половинная нота в 4/4 такта получит 3 доли; 2 доли для половинной ноты и 1 дополнительная доля для точки.

Другой пример - так называемый случайный, т. Е. Линейный острый, плоский или естественный знак. Диез вызывает повышение ноты на полшага, бемоль вызывает понижение ноты на полшага, а естественный знак отменяет диез или бемоль (либо случайно, либо из ключевой подписи).

В теории музыки есть и другие примеры, такие как акцентные знаки, стаккато, легато и фразировка. В программировании здесь есть несколько параллелей; некоторые могут считаться методами; другие могут быть собственностью; и некоторые из них, такие как тёрн или мордент, могут считаться декораторами (в теории музыки их даже называют орнаментами).

Остановить, повторить и послушать…

Еще одна общая черта языков программирования - концепция итераторов; то есть структуры данных, которые можно перебирать в цикле для различных целей, и функции цикла, которые используются для перебора таких данных. Выражение for item in list: в Python - очень распространенная конструкция.

Да, у музыки тоже есть итераторы. Есть несколько разновидностей, таких как Da Capo, Dal Segno, и повторяющиеся знаки. Здесь я собираюсь поговорить о повторяющихся знаках, главным образом потому, что они наиболее просты для понимания и наиболее очевидны с символической и визуальной точки зрения. Знаки повторения в их самой простой форме размещаются вокруг ряда тактов, чтобы указать музыканту, что он должен повторить эти такты. Количество повторений обычно по умолчанию равно двум, но его можно определить, сделав текстовое обозначение над нотоносцем. Вот как выглядят основные повторяющиеся знаки:

Другой вариант знаков повторения позволяет повторять одни и те же ноты, но позволяет изменять последние несколько тактов в зависимости от того, в какой итерации находится исполнитель.

В этом примере первый такт повторяется три раза. При первом воспроизведении этого отрывка воспроизводится музыка под большой 1. скобкой. Во второй раз музыка под 1. скобкой игнорируется, а музыка под 2. скобкой воспроизводится. В третий и последний раз музыка под скобками 1. и 2. игнорируется, и воспроизводится музыка под скобками 3. и далее. Если бы мы хотели представить это как псевдокод, это выглядело бы примерно так:

x = 0
for x in range(4):
     play measure 1
     if x == 1:
          play measure 2
     elif x == 2:
          play measure 3
     elif x == 3:
          play measure 4 to end
     x += 1

Вернуть True

Надеюсь, я убедил вас, что музыка и программирование - это не разные дисциплины, а, наоборот, очень похожи как по конструкции, так и по исполнению. То, что я исследовал в этой статье, на самом деле просто царапает поверхность сходства теории музыки и программирования. Если вы хотите исследовать некоторые другие музыкальные темы, которые имеют очевидные параллели в мире программирования, вот список тем для изучения и концепция программирования для их сравнения.

Я бы также добавил, что, хотя я оставался на относительно высоком уровне в теории музыки, по мере того, как вы исследуете ее глубже, параллели с кодом становятся еще более ясными. Я бы посоветовал вам глубже изучить любую из упомянутых мной тем.

Приложение

Некоторые из основных музыкальных примеров для этой статьи были сгенерированы с помощью lilypond, и если вы заинтересованы в создании собственных нот, начать работу с ними довольно легко и невероятно эффективно. Остальные примеры взяты из музыки, являющейся общественным достоянием, с сайта musopen.org.

РАСКРЫТИЕ ИНФОРМАЦИИ: © 2020 Capital One. Мнения принадлежат отдельному автору. Если в этом посте не указано иное, Capital One не является аффилированным лицом и не поддерживается ни одной из упомянутых компаний. Все используемые или отображаемые товарные знаки и другая интеллектуальная собственность являются собственностью соответствующих владельцев.