Перейти к содержимому


Фотография

Note Sequencer - Создавай музыку

Opencomputers Музыка

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 Оффлайн   Laine_prikol

Laine_prikol
  • Пользователи
  • Сообщений: 133
  • Уровень сигнала: 0,54%
  • В игре: 4 час. 6 мин.

Награды

           

Отправлено 06 Март 2017 - 19:17

Описание:

Сегодня я вам покажу программу Note Sequencer которая позволит создавать мини музыкальные треки. В программе есть 10 цикличных нот которые можно менять, также можно сделать рандом трек. Программа очень простая. По возможности пишите свои предложения что можно добавить (если конечно, смогу)

 

Установка:

pastebin get PYAySJ27 note (код) (0.1)

pastebin get 4fng04sA note (код) (0.2)

pastebin get 4fng04sA note (код) (0.3)

 

Запуск:

note

 

 

История версий

Спойлер

 

Версия 0.3

Оптимизация и уменьшения кода

Прикрепленные изображения

  • 2017-03-06_19.09.38.png

Сообщение отредактировал Laine_prikol: 07 Март 2017 - 17:14

  • Totoro, ECS и ALeXeR это нравится

#2 Оффлайн   qwertyMAN

qwertyMAN
  • Пользователи
  • Сообщений: 1 427
  • Уровень сигнала: 0,14%
  • В игре: 1 час. 3 мин.
  • ГородCity17

Награды

                             

Отправлено 06 Март 2017 - 21:25

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

Далее я посмотрел в код и был шокирован:

currentNote = 0
note1 = 0
note2 = 0
note3 = 0
note4 = 0
note5 = 0
note6 = 0
note7 = 0
note8 = 0
note9 = 0
note10 = 0
note1sec = 0
note2sec = 0
note3sec = 0
note4sec = 0
note5sec = 0
note6sec = 0
note7sec = 0
note8sec = 0
note9sec = 0
note10sec = 0
i = 0
i2 = 0

Получается ты не знаешь и не умеешь пользоваться массивами, которые бы намного упростили бы работу с переменными. И тут я подумал что всё! Меня больше тут нечем удивить, но тут я увидел ЭТО...

os.sleep(0.1)
    if keyboard.isKeyDown(0x3B) == true then -- f1
    os.sleep(0.1)
    print("Настройка ноты 1")
    -- Чтение частоты
    io.write("Частота: ")
    note1 = io.read("*number")
    print("Частота установлена на"..note1)
    -- Чтение длительностей
    io.write("Длительность (в секундах): ")
    note1sec = io.read("*number")
    print("Длительность установлена на"..note1sec)
    redrawMenu()
    end
os.sleep(0.1)
    if keyboard.isKeyDown(0x3C) == true then -- f2
    os.sleep(0.1)
    print("Настройка ноты 2")
    -- Чтение частоты
    io.write("Частота: ")
    note2 = io.read("*number")
    print("Частота установлена на"..note2)
    -- Чтение длительностей
    io.write("Длительность (в секундах): ")
    note2sec = io.read("*number")
    print("Длительность установлена на"..note2sec)
    redrawMenu()
    end
    if keyboard.isKeyDown(0x3D) == true then -- f3
    os.sleep(0.1)
    print("Настройка ноты 3")
    -- Чтение частоты
    io.write("Частота: ")
    note3 = io.read("*number")
    print("Частота установлена на"..note3)
    -- Чтение длительностей
    io.write("Длительность (в секундах): ")
    note3sec = io.read("*number")
    print("Длительность установлена на"..note3sec)
    redrawMenu()
    end

Отлично написанный код!

Спойлер

В общем. Вместо того, чтобы использовать удобненькие православные циклы, ты использовал копипастинг! Это гениально!

 

В общем, пора подводить итоги.

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

А теперь сравни свой код с этим http://computercraft...nie-redstounom/

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

Напомню, это 280 строк кода. Всего-то на 2 больше чем у тебя. Чуешь разницу?

 

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



#3 Оффлайн   Laine_prikol

Laine_prikol
  • Автор темы
  • Пользователи
  • Сообщений: 133
  • Уровень сигнала: 0,54%
  • В игре: 4 час. 6 мин.

Награды

           

Отправлено 07 Март 2017 - 13:17

Спойлер

1. Тут цикл есть (может я немного не понял тебя)

Спойлер

2. Массивов нет. ты тут прав.


Сообщение отредактировал Laine_prikol: 07 Март 2017 - 13:20


#4 Оффлайн   qwertyMAN

qwertyMAN
  • Пользователи
  • Сообщений: 1 427
  • Уровень сигнала: 0,14%
  • В игре: 1 час. 3 мин.
  • ГородCity17

Награды

                             

Отправлено 07 Март 2017 - 13:42

1. Тут цикл есть (может я немного не понял тебя)

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

 

Кроме того, у тебя не типичные отступы. Отступы делаются когда пишешь что-то внутри do ... end или then ... end и в прочих подобных случаях, кроме того, отступы могут складываться. Например идёт цикл, всё что внутри имеет один отступ. Внутри есть этого цикла есть условие if. Всё что внутри будет иметь уже 2 отступа, так как содержимое находится и в условии и в цикле. Для вложенных циклов/условий правило такое же.

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

 

Следующий момент, это условие if x == true then ... end Тут суть такова, если после if будет любая переменная кроме nil (пустая или не существующая переменная) или false, то цикл выполняться будет. А значит, это выражение можно сократить до if x then .. end

 

Ещё в твоём случае, тебе проще вместо keyboard.isKeyDown(0x3B) == true использовать обработку событий через local key = {event.pull("key_down")}

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

Такой способ не потребует выставлять задержки, так как функция будет просто ждать пока событие не произойдёт. Да и к тому же код станет намного лучше, как визуально, так и по нагрузке на сервер/комп


  • eu_tomat это нравится

#5 Оффлайн   Laine_prikol

Laine_prikol
  • Автор темы
  • Пользователи
  • Сообщений: 133
  • Уровень сигнала: 0,54%
  • В игре: 4 час. 6 мин.

Награды

           

Отправлено 07 Март 2017 - 13:52

Спойлер

Я привык уже к keyboard api. Потом может переделаю, уже убрал кучу переменных сделал большой массив, и убрал ненужные строки кода, и с 278 строк уменьшил до 223



#6 Оффлайн   Arseniy10

Arseniy10
  • Пользователи
  • Сообщений: 97
  • Уровень сигнала: 0,14%
  • В игре: 1 час. 3 мин.
  • ГородКаруселин

Награды

     

Отправлено 07 Март 2017 - 16:39

Вместо кучи копипаста с настройкой нот ты мог создать функцию:

function setNote(numNote,key)
    if keyboard.isKeyDown(key) then
        os.sleep(0.1)
        print("Настройка ноты " .. numNote)
        -- Чтение частоты
        io.write("Частота: ")
        note[numNote] = io.read("*number")
        -- Чтение длительностей
        io.write("Длительность (в секундах): ")
        notesec[numNote] = io.read("*number")
        redrawMenu()
    end
end

  • Totoro, qwertyMAN, Kartze и еще 1 это нравится

#7 Оффлайн   Laine_prikol

Laine_prikol
  • Автор темы
  • Пользователи
  • Сообщений: 133
  • Уровень сигнала: 0,54%
  • В игре: 4 час. 6 мин.

Награды

           

Отправлено 07 Март 2017 - 16:49

 

Вместо кучи копипаста с настройкой нот ты мог создать функцию:

function setNote(numNote,key)
    if keyboard.isKeyDown(key) then
        os.sleep(0.1)
        print("Настройка ноты " .. numNote)
        -- Чтение частоты
        io.write("Частота: ")
        note[numNote] = io.read("*number")
        -- Чтение длительностей
        io.write("Длительность (в секундах): ")
        notesec[numNote] = io.read("*number")
        redrawMenu()
    end
end

Попробую добавить в свой код

UPD: с 223 строк сжал до 112


Сообщение отредактировал Laine_prikol: 07 Март 2017 - 17:08


#8 Оффлайн   Arseniy10

Arseniy10
  • Пользователи
  • Сообщений: 97
  • Уровень сигнала: 0,14%
  • В игре: 1 час. 3 мин.
  • ГородКаруселин

Награды

     

Отправлено 07 Март 2017 - 17:39

Попробую добавить в свой код

UPD: с 223 строк сжал до 112

Еще кое-что заметил

Mw8NBic.png

Используй цикл

for i = 1, i2 do
    for noteNum=1 ,10 do
      os.sleep(0)
      computer.beep(note[noteNum],notesec[noteNum])
      currentNote = currentNote + 1
      redrawMenu()
    end
end


#9 Оффлайн   qwertyMAN

qwertyMAN
  • Пользователи
  • Сообщений: 1 427
  • Уровень сигнала: 0,14%
  • В игре: 1 час. 3 мин.
  • ГородCity17

Награды

                             

Отправлено 08 Март 2017 - 01:04

Я привык уже к keyboard api. Потом может переделаю, уже убрал кучу переменных сделал большой массив, и убрал ненужные строки кода, и с 278 строк уменьшил до 223

Да ну, этот keyboard api я посмотрел на вики. Там функций мало, да и мусор один.

Переходи на event api. Там и фильтры для событий есть и даже можно фоново запускать через event.listen() несколько отслеживающих функций на отслеживания разных событий. Например в моей проге 3-4 таких стоят. Одновременно отслеживают подключение/отключение устройств от сети и изменение пришедших сигналов красного камня на всех компонентах для работы с красным камнем. В общем, очень полезная и удобная вещь.







Темы с аналогичным тегами Opencomputers, Музыка

Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных