Перейти к публикации
Форум - ComputerCraft
Laine_prikol

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

Рекомендованные сообщения

Описание:

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

 

Установка:

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

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

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

 

Запуск:

note

 

 

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

 

 

[0.1] Первый релиз
[0.2] Уменьшен код 
[0.3] Оптимизация и уменьшения кода

 

 

 

Версия 0.3

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

post-18530-0-70041500-1488817030_thumb.png

Изменено пользователем Laine_prikol
  • Like 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Прочитав заголовок, я уже подумал, что ты осуществил мою давнюю идею построить полноценный проигрыватель и редактор музыки. Возможно даже в .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

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

 

1.jpg

 

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

 

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

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

А теперь сравни свой код с этим http://computercraft.ru/topic/1570-oc-redcontrol-udobnoe-upravlenie-redstounom/

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

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

 

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

  • Like 7

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Прочитав заголовок, я уже подумал, что ты осуществил мою давнюю идею построить полноценный проигрыватель и редактор музыки. Возможно даже в .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

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

 

1.jpg

 

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

 

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

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

А теперь сравни свой код с этим http://computercraft.ru/topic/1570-oc-redcontrol-udobnoe-upravlenie-redstounom/

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

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

 

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

 

 

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

 

 

5d05a6442ae4407d5edca1d4600d1dc5.png

 

 

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

Изменено пользователем Laine_prikol

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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 сохранится пронумерованная таблица, из которой можно получить адрес клавиатуры откуда пришёл сигнал, номер нажатой клавиши, ник игрока нажавший клавишу и прочую нужную инфу.

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

  • Like 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 сохранится пронумерованная таблица, из которой можно получить адрес клавиатуры откуда пришёл сигнал, номер нажатой клавиши, ник игрока нажавший клавишу и прочую нужную инфу.

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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
  • Like 4

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×