Laine_prikol 48 Опубликовано: 6 марта, 2017 (изменено) Описание: Сегодня я вам покажу программу 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 Оптимизация и уменьшения кода Изменено 7 марта, 2017 пользователем Laine_prikol 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 6 марта, 2017 Прочитав заголовок, я уже подумал, что ты осуществил мою давнюю идею построить полноценный проигрыватель и редактор музыки. Возможно даже в .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.ru/topic/1570-oc-redcontrol-udobnoe-upravlenie-redstounom/ Там на 2 строки кода больше, чем в твоём коде, но функционала намного больше. Программа содержит и графический интерфейс и часть кода для отлавливания кликов по экрану и команды реагирование на события. И даже поддержку подключения и отключения компонентов во время работы. Напомню, это 280 строк кода. Всего-то на 2 больше чем у тебя. Чуешь разницу? А всё дело в том, что у меня использованы циклы и массивы, а у тебя нет. И это ужасно. Ты обязан их изучить, иначе будешь и дальше так же перерабатывать, писать больше кода с меньшей эффективностью. 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Laine_prikol Автор темы 48 Опубликовано: 7 марта, 2017 (изменено) Прочитав заголовок, я уже подумал, что ты осуществил мою давнюю идею построить полноценный проигрыватель и редактор музыки. Возможно даже в .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.ru/topic/1570-oc-redcontrol-udobnoe-upravlenie-redstounom/ Там на 2 строки кода больше, чем в твоём коде, но функционала намного больше. Программа содержит и графический интерфейс и часть кода для отлавливания кликов по экрану и команды реагирование на события. И даже поддержку подключения и отключения компонентов во время работы. Напомню, это 280 строк кода. Всего-то на 2 больше чем у тебя. Чуешь разницу? А всё дело в том, что у меня использованы циклы и массивы, а у тебя нет. И это ужасно. Ты обязан их изучить, иначе будешь и дальше так же перерабатывать, писать больше кода с меньшей эффективностью. 1. Тут цикл есть (может я немного не понял тебя) 2. Массивов нет. ты тут прав. Изменено 7 марта, 2017 пользователем Laine_prikol Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 7 марта, 2017 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 сохранится пронумерованная таблица, из которой можно получить адрес клавиатуры откуда пришёл сигнал, номер нажатой клавиши, ник игрока нажавший клавишу и прочую нужную инфу. Такой способ не потребует выставлять задержки, так как функция будет просто ждать пока событие не произойдёт. Да и к тому же код станет намного лучше, как визуально, так и по нагрузке на сервер/комп 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Laine_prikol Автор темы 48 Опубликовано: 7 марта, 2017 В программировании разрешены вложенные циклы. Ты мог спокойно, не копировать для каждой ноты отдельные настройки, а задать их через цикл. Кроме того, у тебя не типичные отступы. Отступы делаются когда пишешь что-то внутри 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Arseniy10 50 Опубликовано: 7 марта, 2017 Вместо кучи копипаста с настройкой нот ты мог создать функцию: 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 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Laine_prikol Автор темы 48 Опубликовано: 7 марта, 2017 (изменено) Вместо кучи копипаста с настройкой нот ты мог создать функцию: 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 Изменено 7 марта, 2017 пользователем Laine_prikol Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Arseniy10 50 Опубликовано: 7 марта, 2017 Попробую добавить в свой код UPD: с 223 строк сжал до 112 Еще кое-что заметил Используй цикл 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 7 марта, 2017 Я привык уже к keyboard api. Потом может переделаю, уже убрал кучу переменных сделал большой массив, и убрал ненужные строки кода, и с 278 строк уменьшил до 223 Да ну, этот keyboard api я посмотрел на вики. Там функций мало, да и мусор один. Переходи на event api. Там и фильтры для событий есть и даже можно фоново запускать через event.listen() несколько отслеживающих функций на отслеживания разных событий. Например в моей проге 3-4 таких стоят. Одновременно отслеживают подключение/отключение устройств от сети и изменение пришедших сигналов красного камня на всех компонентах для работы с красным камнем. В общем, очень полезная и удобная вещь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах