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

Зачем вообще связывать музыку с кодом?

Наверное, вы хотя бы раз ловили себя на мысли, что код — это музыка. Кто-то говорит: «мой проект — как симфония», кто-то шутит про «джазовый» рефакторинг. Но если убрать метафоры, оказывается, что связи между музыкой и алгоритмами куда глубже.

Музыка устроена строго математически: частоты, пропорции, ритмы. Но при этом она остаётся эмоциональной и живой. Программы мы тоже строим по строгим правилам, но всегда ищем красоту в архитектуре и элегантность решений.

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

Интервалы и бинарные операции

Возьмём простейший аккорд — мажорное трезвучие: C–E–G. В терминах частот это соотношение 4:5:6. То есть уже на уровне звука у нас есть пропорции, которые можно представить как операции над числами.

Интервал — это по сути разность или отношение. Если мы переведём его в код, то получится что-то вроде:

# Python
import math

# частоты в Гц
C = 261.63
E = 329.63
G = 392.00

def interval_ratio(f1, f2):
    return round(f2 / f1, 3)

print(interval_ratio(C, E))  # 1.26 (примерно квинта)
print(interval_ratio(E, G))  # 1.189 (примерно терция)

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

Гармония как объектно-ориентированная модель

Если подумать, аккорд — это объект. У него есть поля (ноты), методы (инверсии, транспозиции), и он может наследоваться. Например, добавив к C–E–G ноту B, мы получим Cmaj7.

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

Гармония как объектно-ориентированная модель

Если подумать, аккорд — это объект. У него есть поля (ноты), методы (инверсии, транспозиции), и он может наследоваться. Например, добавив к C–E–G ноту B, мы получим Cmaj7.

# Python
class Chord:
    def __init__(self, notes):
        self.notes = notes

    def transpose(self, semitones):
        return Chord([n + semitones for n in self.notes])

    def invert(self):
        return Chord(self.notes[1:] + [self.notes[0] + 12])  # октава выше

Cmaj = Chord([0, 4, 7])  # до-мажор
print("Cmaj inversion:", Cmaj.invert().notes)

Здесь аккорд ведёт себя почти как класс в ООП. А последовательность аккордов уже напоминает полиморфизм: один и тот же объект может вести себя по-разному в зависимости от контекста.

Аккордовые прогрессии и графы

Любая гармоническая последовательность — это граф переходов. К примеру, классическая II–V–I прогрессия (Dm–G–C) в джазе работает как устойчивая цепь.

Если мы запишем это в терминах графов: вершины — аккорды, рёбра — допустимые переходы. И тут внезапно открывается связь с теорией конечных автоматов.

# Python
import networkx as nx
import matplotlib.pyplot as plt

progression = nx.DiGraph()
progression.add_edges_from([
    ("Dm", "G"),
    ("G", "C"),
    ("C", "Dm")
])

nx.draw(progression, with_labels=True, node_size=2000, node_color="lightblue")
plt.show()

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

Ритм и многопоточность

Ритм — это тайминг. В музыке есть такты, доли, пульс. В коде — тики процессора, шедулинг, потоки.

Иногда я ловлю себя на мысли, что синкопа в джазе напоминает асинхронность в Python. Вроде всё в одном темпе, но часть задач внезапно «выпадает» и возвращается позже.

# Python (asyncio)
import asyncio

async def beat(name, delay):
    while True:
        await asyncio.sleep(delay)
        print(name, "tick")

async def main():
    await asyncio.gather(
        beat("Drums", 1),
        beat("Bass", 2),
        beat("Piano", 3)
    )

asyncio.run(main())

По сути, мы получили «ансамбль» корутин. Музыка звучит из кода.

Диссонанс как баг и как фича

Диссонанс в музыке — это напряжение. В коде — баг или «некрасивая» архитектура. Но и там, и там иногда диссонанс нужен.

Например, в джазе диссонанс создаёт движение, а в алгоритмах — может указывать на точки роста. Когда мы сознательно делаем обходной костыль, это похоже на аккорд с задержанием (suspended chord).

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

Алгоритмы композиции и генеративная музыка

Алгоритмы тоже можно «сочинять». Есть генеративные модели, которые строят музыку по правилам. Это напоминает то, как мы пишем код для автогенерации тестов или конфигураций.

# Python
import random

notes = ["C", "D", "E", "F", "G", "A", "B"]

def generate_progression(length=4):
    return [random.choice(notes) for _ in range(length)]

print("Random progression:", generate_progression())

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

Заключение: почему это важно для разработчиков

Музыка учит нас работать с паттернами, симметрией и асимметрией, балансом простоты и сложности. Всё это напрямую применимо к архитектуре ПО.

Мы часто думаем, что вдохновение приходит только из других проектов или книг по программированию. Но иногда самые неожиданные источники — музыка, живопись, физика — могут подсказать нам решения, которых мы бы не нашли в документации.

И в следующий раз, когда будете слушать аккорды, спросите себя: «А если бы это был алгоритм — как бы он выглядел?»

Комментарии (9)


  1. af7
    29.09.2025 15:11

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

    А вообще, не приходило в голову что и в музыке и в программировании одни и те же концепции не просто так? Может потому что это не совпадение?


    1. lkik
      29.09.2025 15:11

      > тему стоило проработать намного шире и глубже

      книга глубоко и широко

      Теория музыки: Визуальное представление гармонии. (Олейников Роман Владимирович, Линькова Мария Владимировна)

      https://www.youtube.com/watch?v=K50UTBfYRnw


      1. olgur392876 Автор
        29.09.2025 15:11

        Благодарю!


  1. nixooyase
    29.09.2025 15:11

    Есть очень интересный язык программирования для музыки, называет Strudel: https://strudel.cc

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


    1. olgur392876 Автор
      29.09.2025 15:11

      Читал про него - Strudel - это фактически DSL для звука. Красиво показывает, как абстракции из программирования можно применить к музыке.



  1. Trifon_Ivanovitch
    29.09.2025 15:11

    Музыка, пропорции, ритм , frequency - автор рассуждает, кто читает пытается воспринять … Простой вопрос -, а причем здесь математика… Россия всегда отличалась стадностью , но чтобы до такой степени… Понятно когда человек занимался теоретической или прикладной математикой, механикой, физикой… Ну допустим есть тон, субтон, не знаю … привести хотя пример с задачей, с формулами, корреляции звуков , ряд Фурье… но совершенно ничего этого нет , как в домино- пусто-пусто … В основном статьи с упоминанием слова математика - это перепечатка из интернета, Wikipedia …. 40-50 лет назад , почти в любую статью вставляли - партия, Ленин, коммунизм…. Сейчас возможно, кремлевский кормчий дал указание вставлять везде где только можно, слово- математика…, а ну да, конечно же и импортозамещение…


    1. avk22
      29.09.2025 15:11

      Комбинаторика это тоже часть математики, а музыка по сути эта самая комбинаторика и есть причем во всех основных разделах


  1. avk22
    29.09.2025 15:11

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

    Конструктору достаточно скармливать основную ноту, вид аккорд и произвольные надстройки(на случай если это будет,например, до мажор+ коленом в половину рояля, по умолчанию пустые). Что имеем при таком подходе: то что у вас написано будет работать также, но зато сразу из коробки таким аккордом можно оперировать в гармонии, строить мелодии в нужных ладах, брать отдельные ступени использовать по разному, например разными инструментами итд. На старте займет чуть больше времени, но если все это планируется делать, в результате выйдет дешевле