Мелодии для пьезопищалки

Тема в разделе "Глядите, что я сделал", создана пользователем PULSE, 1 мар 2012.

  1. skoroxod

    skoroxod Нерд

    tony igy - astronomia
     

    Вложения:

    • astronomia.txt
      Размер файла:
      15,2 КБ
      Просмотров:
      2.952
    freizi нравится это.
  2. skoroxod

    skoroxod Нерд

    Жуки-села батарейка
     

    Вложения:

  3. skoroxod

    skoroxod Нерд

    Игра престолов
     

    Вложения:

  4. skoroxod

    skoroxod Нерд

    pain-shut your mouth
     

    Вложения:

  5. skoroxod

    skoroxod Нерд

    ходячие
     

    Вложения:

    • walking dead.txt
      Размер файла:
      14,2 КБ
      Просмотров:
      1.100
  6. skoroxod

    skoroxod Нерд

    тетрадь смерти
     

    Вложения:

    • death note.txt
      Размер файла:
      18,6 КБ
      Просмотров:
      2.378
  7. Рокки1945

    Рокки1945 Гуру

    спасибо - в протеусе уже послушал - КАЙФ
     
  8. skoroxod

    skoroxod Нерд

    ;)
     
  9. Airbus

    Airbus Радиохулиган Модератор

    Шо за тетрадь смерти?
     
  10. Airbus

    Airbus Радиохулиган Модератор

    А я «батарейку» послушал в реале—Зачот!:)
     
    Последнее редактирование: 28 мар 2021
    skoroxod нравится это.
  11. skoroxod

    skoroxod Нерд

    это из аниме тетрадь смерти, довольно таки известное, его еще по-моему запретили)
     
  12. skoroxod

    skoroxod Нерд

    тему из пиратов карибского моря накатал вчера
     

    Вложения:

  13. skoroxod

    skoroxod Нерд

    из букиных также есть заглавная тема(Счастливы вместе)
     

    Вложения:

  14. skoroxod

    skoroxod Нерд

    ну и чисто для ровных пацанчиков: бутырка-запахло весной
     

    Вложения:

  15. Igor68

    Igor68 Гуру

    Я так понимаю Вы написали программу, которая переводит партитуру (может и с листа музыкального нотного) в формирование файла. Учитывая ноты и длительность каждой, а так же паузы. Даже наверное и темп партитуры. Круто если так.
    Ну и как тут говорили наверное лучше через данные (структура) типа:
    Код (C++):
    typedef {
       int tone;
       int time;
       int pause;
    } TICK;
    А потом применяя:
    Код (C++):
    TICK ml[200]; //массив из 200 нот/пауз
    Ну это как пример. По смыслу если pause > 0, то это пауза с временем pause, иначе звук с длительностью time и чатотой/тональностью tone.
    А некий цикл пусть извлекает данные и исполняет мелодию.

    Простите если что-то не так сказал. Ну или это было уже сказано.
     
    Airbus нравится это.
  16. Airbus

    Airbus Радиохулиган Модератор

    А пардон извините за глупый вопрос что такое аниме? А то дожил до 53 лет и дослужился до капитана Аэробуса а что это такое не знаю? Анимация , аниматор знаю а это из этой серии?
     
    skoroxod нравится это.
  17. skoroxod

    skoroxod Нерд

    если грубоговоря , то это японские мультики, а подробнее можете почитать в википедии)
     
  18. Airbus

    Airbus Радиохулиган Модератор

    Все нашол. Точно японские мультики. Помню в моем деццтве был такой « Корабль Призрак»

     
    skoroxod нравится это.
  19. модифицировал ваш код

    этот код пишет мелодии во флеш(progmem) по сути дверной звонок нужна библиотека gyverButton и файл play там функции ob_play должны быть

    Код (C++):

    #define RED 6
    #define GREEN 10
    #define BLUE 11
    #define tonePin 9
    #define button1 2
    #define button2 3

    #include <GyverButton.h>
    GButton butt1(button1 , HIGH_PULL, NORM_OPEN);
    GButton butt2(button2 , HIGH_PULL, NORM_OPEN);
    #include "play.h"

    int musicNum = 0;
    const int molodyCount = 3;
    const char music1[] PROGMEM = {"MNT150L4O3EEFGGFEDCCDEL2EDL4EEFGGFEDCCDEL2DL8CL2CDL4ECDL8EFL4ECDL8EFL4EDCDL2<GL4>EEFGGFEDCCDEL16DEDEDEDL8CL2C"};
    const char music2[] PROGMEM = {"MST255L2O2E.L4F+L2G.L4EGGF+EL2F+L4<BP4L2>F+.L4GL2A.L4F+AAGF+L1EL2B>EDL4EDCC<BAL2BEP4>CL4<AL2B.L4GF+<B>GF+L1EL2B>EDL4EDCC<BAL2BEP4>CL4<AL2B.L4GF+<B>GF+L1EL4AFGL2F"};
    const char music3[] PROGMEM = {"MNT150L8O4CCL4DCFL2EL8CCL4DCGL2FL8CCL4>C<AFEL2DL8A+A+L4AFGL2FL8CCL4DCFL2EL8CCL4DCGL2FL8CCL4>C<AFEL2DL8A+A+"};
    char musicTemp[150] = "";

    const char* const names[] PROGMEM = {
      music1,music2,music3,
    };

    void setup() {
      Serial.begin(9600);
      pinMode(tonePin, OUTPUT);
    }

    void loop() {
      butt1.tick();
      butt2.tick();
      if (butt1.isPress()) {
        musicNum++;
        if (musicNum >= molodyCount) musicNum = 0;
        Serial.println(musicNum);
      }
      if (butt2.isPress()) {
        playM(musicNum);
      }
    }

    void playM(int num) {
      Serial.println(num);
      NormToPgm(&names[num]);
    }

    void NormToPgm(int charMap) {
      char buffer[150];
      uint16_t ptr = pgm_read_word(charMap);
      uint8_t i = 0;
      do {
        buffer[I] = (char)(pgm_read_byte(ptr++));
      } while (buffer[i++] != NULL);
      Serial.println(buffer);
      Qb_PLAY(buffer);
    }
     
    [/I]
     
  20. вторая версия моего кода основана на этом но почти идеален этот код включает в себя логику работы покупного дверного звонка
    и запись мелодий в progmem память и даже светомузыку
    мелодии пришлось убрать ато не влезало в сообщения
    Код (C++):

    #define RED 6
    #define GREEN 10
    #define BLUE 11
    #define tonePin 9
    #define button1 2
    #define button2 3

    #include <GyverButton.h>
    GButton butt1(button1 , HIGH_PULL, NORM_OPEN);
    GButton butt2(button2 , HIGH_PULL, NORM_OPEN);

    bool flag1 = 0;

    int musicNum = 0;
    const int molodyCount = 16;
    const char music1[] PROGMEM = {""};
    const char music2[] PROGMEM = {""};
    const char music3[] PROGMEM = {""};
    const char music4[] PROGMEM = {""};
    const char music5[] PROGMEM = {""};
    const char music6[] PROGMEM = {""};
    const char music7[] PROGMEM = {""};
    const char music8[] PROGMEM = {""};
    const char music9[] PROGMEM = {""};
    const char music10[] PROGMEM = {""};
    const char music11[] PROGMEM = {""};
    const char music12[] PROGMEM = {""};
    const char music13[] PROGMEM = {""};
    const char music14[] PROGMEM = {""};
    const char music15[] PROGMEM = {""};
    const char music16[] PROGMEM = {""};

    char musicTemp[200] = "";

    const char* const names[] PROGMEM = {
      music1, music2, music3, music4, music5, music6, music7, music8, music9, music10, music11, music12, music13, music14, music15, music16,
    };

    void setup() {
      randomSeed(analogRead(A0));
      pinMode(tonePin, OUTPUT);
      pinMode(RED, OUTPUT);
      pinMode(GREEN, OUTPUT);
      pinMode(BLUE, OUTPUT);
    }

    void loop() {
      button1tick2();
      butt2.tick();
      if (butt2.isPress()) {
        playM(musicNum);
      }
    }

    void playM(int num) {
      NormToPgm(&names[num]);
      analogWrite(RED, 0);
      analogWrite(GREEN, 0);
      analogWrite(BLUE, 0);
    }

    void NormToPgm(int charMap) {
      char buffer[150];
      uint16_t ptr = pgm_read_word(charMap);
      uint8_t i = 0;
      do {
        buffer[i] = (char)(pgm_read_byte(ptr++));
      } while (buffer[i++] != NULL);
      Qb_PLAY(buffer);
    }

    int freq[7][12] = {
      {65, 69, 73, 78, 82, 87, 92, 98, 104, 110, 117, 123},                     //0 = Большая октава
      {131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247},             //1 = Малая октава
      {262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494},             //2 = 1-я октава
      {523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988},             //3 = 2-я октава
      {1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1976}, //4 = 3-я октава
      {2093, 2218, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951}, //5 = 4-я октава
      {4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902}, //6 = 5-я октава
    };

    boolean r;
    boolean g;
    boolean b;

    void button1tick2() {
      butt1.tick();
      if (butt1.isPress() || flag1) {
        flag1 = 0;
        musicNum++;
        if (musicNum >= molodyCount) musicNum = 0;
        playM(musicNum);
      }
    }
    void ledRandom() {
      do {
        r = random(0, 2);
        g = random(0, 2);
        b = random(0, 2);
      } while ((!r && !g && !b) || (digitalRead(RED) == r && digitalRead(GREEN) == g && digitalRead(BLUE) == b));
      digitalWrite(RED, r);
      digitalWrite(GREEN, g);
      digitalWrite(BLUE, b);
    }
    int extractNumber(int& myNumber, char Muz[], int& curPosition)
    {
      int digitsNumber = 0;
      int curDigit = 0;
      myNumber = 0;
      do
      {
        if ((Muz[curPosition] > 47) && (Muz[curPosition] < 58)) // Коды ASCII цифр '0' == 48 , "9' == 57
        {
          curDigit = Muz[curPosition] - 48;
          digitsNumber++;
          myNumber = myNumber * 10 + curDigit;
        }
        else
        {
          return digitsNumber;
        }
        curPosition++;
      } while (Muz[curPosition] != '\0');
      return digitsNumber;
    }
    int pointsCount(char Muz[], int& curPosition)
    {
      int pointsNumber = 0;
      do
      {
        if (Muz[curPosition] == '.')
        {
          pointsNumber++;
        }
        else
        {
          return pointsNumber;
        }
        curPosition++;
      } while (Muz[curPosition] != '\0');
      return pointsNumber;
    }
    void Qb_PLAY(char Muz[])
    {
      static int generalOktava;
      int oktava;
      static int tempo = 255;
      int Nota = 0;
      int  curPosition, curNota4;
      unsigned long currentNotaPauseDuration;
      unsigned long currentNotaDuration;
      unsigned long  pauseDuration;
      int takt = 240000 / tempo;
      bool isNota;
      bool isPause;
      int pointsNum = 0;
      float generalNotaMultipl = 0.875;
      static float NotaLong;
      float curMultipl;
      float tempFlo;
      float curPause;
      unsigned long tempLong;
      int i = 0;
      do
      {
        isNota = false;
        isPause = false;
        oktava = generalOktava;
        switch (Muz[i]) {
          case '\0': {
              return;
            }
            break;
          case 'C': {
              Nota = 0;
              isNota = true;
            }
            break;
          case 'D': {
              Nota = 2;
              isNota = true;
            }
            break;
          case 'E': {
              Nota = 4;
              isNota = true;
            }
            break;
          case 'F': {
              Nota = 5;
              isNota = true;
            }
            break;
          case 'G': {
              Nota = 7;
              isNota = true;
            }
            break;
          case 'A': {
              Nota = 9;
              isNota = true;
            }
            break;
          case 'B': {
              Nota = 11;
              isNota = true;
            }
            break;
          case 'N': {
              curPosition = i + 1;
              if (extractNumber(curNota4, Muz, curPosition)) {
                i = curPosition - 1;
                if (curNota4) {
                  curNota4--;
                  oktava = curNota4 / 12;
                  Nota = curNota4 % 12;
                  isNota = true;
                }
                else {
                  isPause = true;
                }
              }
            }
            break;
          case 'O': {
              curPosition = i + 1;
              if (extractNumber(oktava, Muz, curPosition)) {
                i = curPosition - 1;
                generalOktava = oktava;
              }
            }
            break;
          case '>': {
              generalOktava++;
            }
            break;
          case '<': {
              generalOktava--;
            }
            break;
          case 'M': {
              switch (Muz[i + 1]) {
                case 'N': {
                    generalNotaMultipl = 0.875; //  =7/8
                    i++;
                  }
                  break;
                case 'L': {
                    generalNotaMultipl = 1.0;
                    i++;
                  }
                  break;
                case 'S': {
                    generalNotaMultipl = 0.75;
                    i++;
                  }
                  break;
                case 'F': {
                    i++;
                  }
                  break;

                case 'B': {
                    i++;
                  }
                  break;
              }
            }
            break;
          case 'L': {
              curPosition = i + 1;
              if (extractNumber(curNota4, Muz, curPosition)) {
                i = curPosition - 1;
                tempFlo = float(curNota4);
                NotaLong = 1 / tempFlo;
              }
            }
            break;
          case 'T': {
              curPosition = i + 1;
              if (extractNumber(tempo, Muz, curPosition)) {
                i = curPosition - 1;
                takt = 240000 / tempo;
              }
            }
            break;
          case 'P': {
              curPosition = i + 1;
              if (extractNumber(curNota4, Muz, curPosition)) {
                tempFlo = float(curNota4);
                curPause = 1 / tempFlo;
                i = curPosition - 1;
                isPause = true;
              }
            }
            break;
          case ' ': {
              curPause = NotaLong;
              isPause = true;
            }
            break;
        }
        if (isNota) {
          switch (Muz[i + 1]) {
            case '#': { // диез
                Nota++;
                i++;
              }
              break;
            case '+': { // диез
                Nota++;
                i++;
              }
              break;
            case '-': { // бемоль
                Nota--;
                i++;
              }
              break;
          }
          curPosition = i + 1;
          if (extractNumber(curNota4, Muz, curPosition)) {
            currentNotaDuration = takt / curNota4;
            i = curPosition - 1;
          }
        }
        if (oktava < 0) oktava = 0;
        if (oktava > 6) oktava = 6;
        if (isNota || isPause) {
          curPosition = i + 1;
          pointsNum = pointsCount(Muz, curPosition);
          if (pointsNum) i = curPosition - 1;
          curMultipl = 1.0;
          for (int j = 1; j <= pointsNum; j++) {
            curMultipl = curMultipl * 1.5;
          }
          currentNotaPauseDuration = (takt * NotaLong);
        }
        if (isNota) {
          curMultipl = curMultipl * generalNotaMultipl;
          currentNotaDuration = (currentNotaPauseDuration * curMultipl);
          if (Nota < 0) Nota = 0;
          if (Nota > 11) Nota = 11;
          tempLong = freq[oktava][Nota];

          ledRandom();
          tone(tonePin, tempLong, currentNotaDuration);
          myDelay(currentNotaPauseDuration);
          if (flag1) return;
        }
        if (isPause) {
          pauseDuration = takt * curPause * curMultipl;
          myDelay(pauseDuration);
          if (flag1) return;
        }
        i++;
      } while (Muz[i] != '\0');
    }

    void myDelay(unsigned long del) {
      static unsigned long timer1 = 0;
      timer1 = millis();
      for (;;) {
        myDelayFunction();
        if (millis() > timer1 + del || flag1) {
          return;
        }
      }
    }

    void myDelayFunction() {
      butt1.tick();
      if (butt1.isPress()) {
        flag1 = 1;
      }
    }