1

(30 відповідей, залишених у C++)

Спробував замінити, тепер грає нот з 5)

2

(30 відповідей, залишених у C++)

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#include <windows.h>
#include <iostream.h>
#include <mmsystem.h>
#include <string.h>
#include <sstream>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 HMIDIOUT handle; //ініціалізуємо midi
void __fastcall TForm2::Button1Click(TObject *Sender)
{

    unsigned int DEFAULT_DEVICE = 0;         // MIDI пристрій по-замовчуванню
    DWORD Note1; //наша нота
    unsigned int Instrument; //ініціалізуємо змінну інструментів
    int k=0;


    //Вибираєм інструмент
    switch(ComboBox1->ItemIndex)
        {
         case 0 :
         Instrument = 1;
         break;
         case 1 :
         Instrument = 28;
         break;
         case 2:
         Instrument = 118;
         break;
         case 3:
         Instrument = 66;
         break;
        }

   int shifts[7]={ 9, 11, 0, 2, 4, 5, 7 };//"білі клавіші" в хроматичній октаві, з урахуванням того, що C - до.
   int notecode= 12; //С0 - це нота до нульової октави


    int Volume = 0x7f;
    int notu[1000];
    unsigned int gotoviNotu[1000];
    char* onenote;
    AnsiString note4;

    note4=Memo1->Text;     //зчитуємо з memo в ansistring
    onenote=note4.c_str();  //переписуємо в char
     int zminna=0;
    for(int i=0;i<=strlen(note4.c_str());i+=3)
    {
    notu[i]=onenote[i];   //довжина
    notu[i+1]=onenote[i+1];        //нота
    notu[i+2]=onenote[i+2];              //октава
     zminna=notu[i+1];
    gotoviNotu[k]=12+(notu[i+2]*12)+shifts[zminna];

      k++;
    }







    unsigned int i = 0;
//    unsigned int a[]={
//            0x60003e90,
//            0x60003c90,
//            0x007f3e90,
//            0x497f5390,
//            0x60004590,
//            0x007f4590,
//            0x60004590,
//            0x007f4790,
//            0x60004790,
//            0x007f4890,
//            0x60004890,
//            0x60004190,
//            0x097f4390,
//            0x60004590,
//            0x007f4590,
//            0x60004590,
//            0x007f4790,
//            0x60004790,
//            0x007f4890,
//            0x60004890,
//
//            0};

    if(!midiOutOpen(&handle, DEFAULT_DEVICE, 0,0, CALLBACK_NULL))
    {
        midiOutShortMsg(handle, (Volume << 16) | (Instrument << 8) | 0x90);  // Set instrument

        while(gotoviNotu[i])
        {
        Memo2->Lines->Append(gotoviNotu[i]);
            Note1=gotoviNotu[i];
            midiOutShortMsg(handle, Note1);
            Sleep(StrToInt( Edit1->Text));
            i++;

        }

    }
    else
    Edit2->Text="Не ініціалізовано MIDI пристрій";

    midiOutClose(handle);
}
//---------------------------------------------------------------------------

вибачайте за "лайнокод", зробив, щоб з мемо брало ноти, але звучить лише раз, першу ноту і до кінця.
Десь полюбому натупив,

3

(30 відповідей, залишених у C++)

дякую, зараз спробую

4

(30 відповідей, залишених у C++)

Chemist-i написав:
unsigned char* notem;

Це вказівник, спробуйте без зірочки =)

без зірочки - помилки при конвертації

5

(30 відповідей, залишених у C++)

1. потрібно, з поля мемо витягнути ноту вигляду типу (1e3) і сконвертувати її у вигляд (0x007f4590)це для прикладу, щоб потім закинути їх у такому вигляді у масив, з якого будуть зчитуватись і програватись.
2. дещо маю мало практики, тому не привик, але буду намагатись.
3. що на думку спало, те й використав) основну функцію виконує)

6

(30 відповідей, залишених у C++)

щось я застряв на конвертації нот, ніяк не виходить, надати вигляду "0x60003e90"

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#include <windows.h>
#include <iostream.h>
#include <mmsystem.h>
#include <string.h>
#include <sstream>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------



HMIDIOUT handle; //ініціалізуємо midi
void __fastcall TForm2::Button1Click(TObject *Sender)
{
    unsigned char* notem;
        unsigned int notemi[255];

    AnsiString mas[255];
    int k=0;
    for(int i=0;i<=Memo1->Lines->Count;i++)
        {
            char* end=0;
            notem=0;
            mas[i]=Memo1->Lines->Strings[i].c_str();
            notem=mas[i].c_str();

            notemi[i]=strtol(notem,&end,16);

            Memo2->Lines->Append(notemi[i]);
        }

    unsigned int DEFAULT_DEVICE = 0;         // MIDI пристрій по-замовчуванню
    DWORD Note1; //наша нота
    unsigned int Instrument; //ініціалізуємо змінну інструментів



    //Вибираєм інструмент
    switch(ComboBox1->ItemIndex)
        {
         case 0 :
         Instrument = 1;
         break;
         case 1 :
         Instrument = 28;
         break;
         case 2:
         Instrument = 118;
         break;
         case 3:
         Instrument = 66;
         break;
        }

    int Volume = 10;
    unsigned int i = 0;
    unsigned int a[]={
            0x60003e90,
            0x60003c90,
            0x007f3e90,
            0x497f5390,
            0x60004590,
            0x007f4590,
            0x60004590,
            0x007f4790,
            0x60004790,
            0x007f4890,
            0x60004890,
            0x60004190,
            0x097f4390,
            0x60004590,
            0x007f4590,
            0x60004590,
            0x007f4790,
            0x60004790,
            0x007f4890,
            0x60004890,

            0};

    if(!midiOutOpen(&handle, DEFAULT_DEVICE, 0,0, CALLBACK_NULL))
    {
        midiOutShortMsg(handle, (Volume << 16) | (Instrument << 8) | 0xC0);  // Set instrument

        while(a[i])
        {
            Note1=a[i];
            midiOutShortMsg(handle, Note1);
            Sleep(StrToInt( Edit1->Text));
            i++;
        }

    }
    else
    Edit2->Text="Не ініціалізовано MIDI пристрій";

    midiOutClose(handle);
}
//---------------------------------------------------------------------------

що не так? можливо якось можна попростіше?

7

(30 відповідей, залишених у C++)

Перегнав на форму, добавив зміну інструментів через вибір в комбобокс, зміну довжини ноти.

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#include <windows.h>
#include <iostream.h>
#include <mmsystem.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------



HMIDIOUT handle; //ініціалізуємо midi
void __fastcall TForm2::Button1Click(TObject *Sender)
{

    unsigned int DEFAULT_DEVICE = 0;         // MIDI пристрій по-замовчуванню
    DWORD Note1; //наша нота
    int Instrument; //ініціалізуємо змінну інструментів

    //Вибираєм інструмент
    switch(ComboBox1->ItemIndex)
        {
         case 0 :
         Instrument = 1;
         break;
         case 1 :
         Instrument = 28;
         break;
         case 2:
         Instrument = 118;
         break;
         case 3:
         Instrument = 66;
         break;
        }

    int Volume = 10;
    unsigned int i = 0;
    unsigned int a[]={
            0x60003e90,
            0x60003c90,
            0x007f3e90,
            0x497f5390,
            0x60004590,
            0x007f4590,
            0x60004590,
            0x007f4790,
            0x60004790,
            0x007f4890,
            0x60004890,
            0x60004190,
            0x097f4390,
            0x60004590,
            0x007f4590,
            0x60004590,
            0x007f4790,
            0x60004790,
            0x007f4890,
            0x60004890,

            0};

    if(!midiOutOpen(&handle, DEFAULT_DEVICE, 0,0, CALLBACK_NULL))
    {
        midiOutShortMsg(handle, (Volume << 16) | (Instrument << 8) | 0xC0);  // Set instrument

        while(a[i])
        {
            Note1=a[i];
            midiOutShortMsg(handle, Note1);
            Sleep(StrToInt( Edit1->Text));
            i++;
        }

    }
    else
    Edit2->Text="Не ініціалізовано MIDI пристрій";

    midiOutClose(handle);
}
//---------------------------------------------------------------------------

Ще би тепер з нотами розібратись, в якому форматі їх вводити в поле мемо, і як адекватно перегнати в вигляд типу "0x60003e90", пробував підставляти ці самі числа в десятковому вигляді, теж працює

8

(30 відповідей, залишених у C++)

Дуже вдячний за корисні відповіді)
Bartash, Так швидше за все і зроблю, щось не маю бажання придумувати "ровер")
Та й справа тут на більш-менш курсову)

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <tchar.h>
#include <windows.h>
#include <iostream.h>
#include <mmsystem.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
    HMIDIOUT handle;
    unsigned int DEFAULT_DEVICE = 0;         // Default MIDI Device
    DWORD Note1;
    unsigned int i = 0;
    unsigned int a[]={
            0x007f3c90,
            0x60003c90,
            0x007f3e90,
            0x60003e90,
            0x007f4090,
            0x60004090,
            0x007f4190,
            0x60004190,
            0x097f4390,
            0x60004590,
            0x007f4590,
            0x60004590,
            0x007f4790,
            0x60004790,
            0x007f4890,
            0x60004890,
            0};

    if(!midiOutOpen(&handle, DEFAULT_DEVICE, 0,0, CALLBACK_NULL))
    {

    while(a[i])
    {
     Note1=a[i];
     midiOutShortMsg(handle, Note1);
     Sleep(250);
     i++;
    }

    }
    else
    cout << "Error Opening Default MIDI Device" << endl;

return 0;
}
//---------------------------------------------------------------------------

На швидку руку, вийшло щось таке)
Ще підкажіть будь ласка, як інструмент з піаніно на щось інше змінити, пробував через midiOutCacheDrumPatches, це або не те, що треба, або в мене з ним щось "не клеїться")))

9

(30 відповідей, залишених у C++)

Очі.завидющі, в тому то й справа, що варіант не зовсім підходить)



//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <tchar.h>
#include <windows.h>
#include <iostream.h>
#include <mmsystem.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
    HMIDIOUT handle;
    unsigned int DEFAULT_DEVICE = 0;         // Default MIDI Device
    DWORD NoteC = 0x00403c90;
    DWORD NoteE = 0x00404090;
    DWORD NoteG = 0x00404390;

    if(!midiOutOpen(&handle, DEFAULT_DEVICE, 0,0, CALLBACK_NULL))
    {
    midiOutShortMsg(handle, NoteC);
    Sleep(250);

    midiOutShortMsg(handle, NoteE);
    Sleep(250);

    midiOutShortMsg(handle, NoteG);
    Sleep(1500);

    }
    else
    cout << "Error Opening Default MIDI Device" << endl;

return 0;
}
//---------------------------------------------------------------------------

ось дещо найшов, під білдер переробив, працює) залишилось, зробити так, щоб звучало більше ніж три рази і все те що задам, якось через потік?. Ну а форму прикрутити, то вже не складає проблем)

10

(30 відповідей, залишених у C++)

ні, я лише прошу допомогти мені з реалізацією саме програвання нот і тільки.

11

(30 відповідей, залишених у C++)

Необхідна ваша допомога, потрібно реалізувати програму, яка б програвала ноти за допомогою MIDI.
Наприклад є стрічка з нотами: 8g1 4c2 8.g1 16a1 4b1 8e1 8e1 4a1 8.g1 16f1 4g1 8c1 8c1 4d1 8d1 8e1 4f1 чи щось, подібне, ми її зчитуєм (всерівно звідки, чи файлу, чи форми, чи з самого коду програми), а далі через міді вони програються)
Дякую.