Rada začátečníkovi , co místo while

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
filipcos
Příspěvky: 3
Registrován: 31 bře 2018, 10:14

Rada začátečníkovi , co místo while

Příspěvek od filipcos » 31 bře 2018, 10:37

Ahoj, začínám se učit v programovat a nemůžu přijít na to, jak to jinak napsat, u funkce switch nejde napsat do hodnoty proměné TCRT < 124 a s while to také není možné.

while(TCRT < 124){
MIDI.sendControlChange(4, TCRT, 1);
}

potřebuji aby , když je TCRT < 124 , tak dokola posílalo MIDI.sendControlChange a funkci while ukončilo až po neplatnosti podmínky TCRT < 124 .
(

Jak to jinak napsat , jakou jinou funkci použít
děkuji moc za odpověď, snad jsem to napsal trochu srozumitelně.
Olda

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Kontaktovat uživatele:

Re: Rada začátečníkovi , co místo while

Příspěvek od petan » 31 bře 2018, 11:48

No, šlo by třeba použít

Kód: Vybrat vše

if (TCRT < 124){ 
MIDI.sendControlChange(4, TCRT, 1); 
}
Záleží na tom, jak vypadá zbytek programu...

A nebo před funkcí switch ošetřit, že pokud je TCRT < 124 tak pomocná proměnná bude třeba 0.

Kód: Vybrat vše

byte var;

if (TCRT < 124){ 
 var=0;
}
else{
 var=1;
}

switch (var) {
  case 0:
    MIDI.sendControlChange(4, TCRT, 1); 
    break;
  default:
    break;
}

filipcos
Příspěvky: 3
Registrován: 31 bře 2018, 10:14

Re: Rada začátečníkovi , co místo while

Příspěvek od filipcos » 31 bře 2018, 14:31

prosím, jde kontrolér stlačení pedálu k Hi Hat k bicím. Signál úderů na HiHat činel je řešen jiným zařízením-modulem elektronických bicích.

1. Když je TCRT 0-123 tak má jen posílat MIDI.sendControlChange(4, TCRT, 1);
2. a jak je TCRT 124-127 tak má JEDNOU ! poslat MIDI.sendNoteOn(21, 100, 1); a zároveň pořád posílat MIDI.sendControlChange
když zůstává TCRT 124-127 tak jen posílat pořád MIDI.sendControlChange
jak se TCRT změní na 0-123 , tak vyslat MIDI.sendNoteOn(23, 100, 1) a vrátit se k bodu jedna.

jde o to pořád vysílat MIDI.sendControlChange, což je poloha pedálu Hi Hat, ta je snímána potenciometrem a když se pedál stlačí na hodnotu CTRT 124-124 , tak vyslat midi notu MIDI.sendNoteOn(21, 100, 1) -to je zvuk zavřené HIHat, když je pořád zavřená, tak se vysílá jen poloha pedálu a když se pedál uvolní, tak vyslat zvuk otevírané HiHat MIDI.sendNoteOn(23, 100, 1).
Kód čtení hodnot TCRT funguje dobře i posílání midi.
kod je ca takový (nechal jsem pouze co funguje a While nefunguje a ani tam není ten další postup co mně taky nefungoval:

Kód: Vybrat vše

, 
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
MIDI.begin(10);  
}

void loop() {
int TCRT = analogRead(A0); //hi-hat pedal , proměnná CTRT na vstupu A0 
TCRT = map(TCRT, 1030, 0, 0, 127); // změna rozsahu stupnice hodnoty CTRT
if (TCRT > 127) {
TCRT = 127;
}
if (TCRT < 0) {
TCRT = 0;
}
MIDI.sendControlChange(4, TCRT, 1);

/////////////////////// HIHAT PEDAL /////////////////////////
while(TCRT < 124){  
MIDI.sendNoteOn(21, 100, 1); 
MIDI.sendControlChange(4, TCRT, 1);   
delay(100);     
}

filipcos
Příspěvky: 3
Registrován: 31 bře 2018, 10:14

Re: Rada začátečníkovi , co místo while

Příspěvek od filipcos » 31 bře 2018, 14:34

Děkuji, ,ještě zkusím s tím switch, na který jsem už myslel, ale nějak nedomyslel, protože tam mám tolik podmínek.
Olda

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56

Re: Rada začátečníkovi , co místo while

Příspěvek od rejze69 » 02 dub 2018, 19:53

Předně je analog škála jen 1024 a ne 1030. Možná to nevadí, ale nemusí pak dobře odpov¦dat převedená škála. Inverzně ji máš předpokládám záměrně. Cyklus while vykonává VŠECHNY obsažené příkazy v každém průběhu, takž to co se má poslat nejdřív jednou, je třeba poslat podmínkou if před započetím while. Totéž při poklesu pod 123 a opuštění while. A návrat na bod 1 by měl znova začít posílat podle bodu 1. Sám si s arduinem hraju teprv týden, tak si to zkusím nejdřív napsat. Ale v principu by to mělo tak fungovat.

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56

Re: Rada začátečníkovi , co místo while

Příspěvek od rejze69 » 03 dub 2018, 02:14

Tak jsem se nad tím zamyslel ještě jednou a vzhledem k tomu,že nelze u analogového pedálu nijak ohlídat dobu po kterou bude hraniční hodnota platit může proběhnout několik cyklů a tón se bude posílat opakovaně. Vyšlo mi řešení s dvěma cykly for() kdy si střídají platnou proměnnou.
Kód:

Kód: Vybrat vše

  int n = 0;
  
void setup() {
Serial.begin(9600);

}  
void loop() {
  if(n < 1) { // tuhle podmínku si doplň o hraniční hodnotu jednoho tonu
 for(n; n < 1; n++) {
 //n = 1;
 Serial.println("leva");
 delay(500);
 }
 //n = 1;
  }
 else if(n > 0){ //tuhle o hraniční hodnotu druhého tónu
 for(n; n > 0 ; n--) {
  //n = 0;
  Serial.println("prava");
  delay(500);
 }
 //n = 0;
}
}
Cykly zajistí ,že se tón pošle právě jednou při průchodu hraniční hodnotou a dokud se při průchodu druhou hraniční hodnotou nezmění proměnná tak se cyklus nespustí a tón se nezopakuje. Aspoň doufám. Jsem taky úplný zelenáč. Zkus si to pustit a bude se ti střídat levá a pravá dokola,protože tam nejsou další podmínky. Ty si podle svý potřeby doplň tam kde je to okomentovaný.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti