Python (Jython) Воспроизведение заметок из пикселей на картинке - PullRequest
0 голосов
/ 02 марта 2010

Это из класса:

Эта программа о прослушивании цветов. Мы будем рассматривать картинки как партитуры для фортепиано. Напишите функцию под названием listenToPicture, которая принимает одно изображение в качестве аргумента. Сначала показывает картинку. Затем он будет проходить через каждый 4-й пиксель в каждой 4-й строке и делать следующее Он вычислит общее количество красного, зеленого и синего уровней пикселя, разделит его на 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)

Ответы [ 2 ]

1 голос
/ 02 марта 2010

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

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

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

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

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

1 голос
/ 02 марта 2010

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

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

Удачи.

...