2010-05-19 2 views
3

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

>>> from fractions import Fraction 
>>> x = Fraction(4, 4) 
>>> x 
Fraction(1, 1) 

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

Спасибо!

ответ

3

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

9

Да: создайте для этого специальный класс.

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

+0

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

+0

Даже не изобретайте класс для этого. Используйте 'namedtuple'. –

+2

На самом деле, я бы ... но это вопрос теории музыки. Это не просто пара чисел, есть некоторые разумные операции, которые вы, возможно, захотите сделать на сигнатуре времени; добавьте или удалите удары, беря от 3/4 до 4/4, сделайте 3-против-2 с 4/4 до 12/8, разделите планку с 5/4 на 3/4 и 2/4 и другие. Имеет смысл иметь для них методы. –

0

Нет, нет деления – на GCD, который встроен в операции класса фракций. Другие причины, вы, вероятно, хотите, чтобы создать пользовательский класс в любом случае, по крайней мере, если вы работаете с нотной, являются:

  • , чтобы иметь возможность обрабатывать общее время (C) и сократить время (слэш-C) замены для 4/4 и 2/4 – или даже лучше, чтобы сделать это по желанию
  • , чтобы иметь возможность представлять подписи время соединения (например, 2 + 3 + 2/8)
Смежные вопросы