Python (Jython) Воспроизведение заметок из пикселей на картинке

Это из присвоения класса:

Эта программа предназначена для прослушивания цветов. Мы будем рассматривать фотографии как партитуры. Напишите функцию, называемую listenToPicture, которая принимает одно изображение в качестве аргумента. Сначала он показывает картину. Затем он будет проходить каждый четвертый пиксель в каждой четвертой строке и делать следующее. Он вычислит общее количество красного, зеленого и синего уровней пикселя, разделите его на 9, затем добавьте результат в 24. Это число будет номером ноты, воспроизводимым в playNote. Это означает, что чем темнее пиксель, тем ниже заметка; чем светлее пиксель, тем выше нота. Он будет воспроизводить эту ноту на полном объеме (127) на десятую часть секунды (100 миллисекунд). Каждый раз, когда он перемещается в новую строку, он выводит номер строки (значение y) на консоли. Ваша основная функция попросит пользователя выбрать файл с изображением. Он будет печатать количество замещаемых нот (число пикселей на изображении, деленное на 16, почему?). Затем он вызовет функцию listenToPicture.

Хорошо, я отредактировал то, что у меня есть, и единственное, что я не понял (я считаю), - это то, как печатать количество заметок в основной функции. Кстати, спасибо всем, кто помогал. Вы, ребята, потрясающие. Есть ли место для пожертвования на этот сайт?

def main():
   pic=makePicture(pickAFile())
   show (pic)
   listenToPicture(pic)

def listenToPicture(pic):
   w=getWidth(pic)
   h=getHeight(pic)

   for y in range(0,h,4):
       printNow(str(y))
       for x in range (0,w,4):
            px=getPixel(pic,x,y)                            
            r=getRed(px)
            g=getGreen(px)
            b=getBlue(px)
            tot=((r+g+b)/9)+24
            playNote(tot,100,127)

Ответ 1

Робби подходит для ширины/высоты для циклов.

Цикл, который вы используете для получения пикселей и воспроизведения заметок, выглядит так, как будто он получает ВСЕ пиксели и воспроизводит их каждый раз, когда вы получаете уникальные x и y. То, что вы должны делать, это получить пиксель в (x, y), а затем вытащить значения rgb и вызвать в нем примечание к игре. Вам действительно не нужен даже третий цикл. Ты не слишком далеко. Попробуйте написать проблему в логических шагах на простом английском языке. Я нахожу, что помогает тонну, прежде чем начинать кодирование.

Удачи.

Ответ 2

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

Если вы не поняли, как читать пиксель, я рекомендую использовать PIL. Он имеет функции для открытия изображений, зарегистрированных здесь. Затем вы можете получить доступ к пикселю в изображении по его значению x и y, используя getpixel, который задокументирован на той же странице.

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

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

Edit: Теперь ваши петли выглядят лучше, поэтому я достал свои вещи о ваших циклах.