Jump to content

audiocommander

Frequent Writer
  • Posts

    1,358
  • Joined

  • Last visited

Everything posted by audiocommander

  1. http://www.midibox.org/dokuwiki/doku.php?id=what_is_a_midibox
  2. yes. or you could set up one or more bitfields (8 bits max) instead of an array. this involves strucs (and unions), so I hope I don't confuse you ;) example: typedef union { struct { unsigned ALL:8; }; struct { unsigned led1:1; unsigned led2:1; unsigned led3:1; unsigned led4:1; unsigned free:4; }; } something_t; // declare var something_t something; // set bits something.led1 = 1; something.led3 = 0; // get number mynum = something.ALL; regards, Michael
  3. Generally speaking, there's (nearly) everything possible by MIDI with the MB SpeakJet Application (kII) what you can do with the Phrase-A-Lator by RS232. Theoretically you don't need no RS232 at all. Anyway, don't want to hijack this topic, I just mentioned it in case you haven't heard about... Regards, Michael
  4. This is not the right question. The big advantage of MIDIBox is that you can program the Microcontroller and don't need no PC connected. Therefore you can create fully independent devices. If it's easier or not depends on your intended purpose. And: there are a bunch of ready-to-go applications available for MIOS, which you just have to upload by Midi (no programming required at all). In this point, a MIDIBox is easier ...if you know how to solder. I/O means In/Out, so the iowarrior is nothing else than a Core-Module. The difference is, you buy it ready assembled an not as DIY-Kit. And besides not being a modular solution (like MBHP) nor providing ready-to-upload-applications like MB64 or MBSeq, MIDIbox also comes with an "SDK": a ASM or C-based Skeleton to use with the IDE of your choice. Totally platform independent. While there are lots of similar solutions (like Miditron, Ardurio, EZIO, just to name some), there may be surely easier to setup/assemble alternatives, but the easiness has its disadvantages, too: they are either expensive, slow, need a computer to work or have other restrictions. MBHP/MIOS is IMHO by far the most advanced and flexible system of all (besides developing totally customized projects on µC's without MIOS, of course, but that's also very far from being "easy"). Regards, Michael
  5. Das ist ganz normal, dass du beim Reboot einen Upload-Request bekommst, da du ein 2-Sek. Zeitfenster zum neuen Aufspielen von Programmen/MIOS hast. Das ist eine Sicherheitsfunktion, da man sonst den Chip neu brennen müsste, falls sich mal ein Programm direkt nach dem Start aufhängt. Ansonsten: was erwartest du denn was passiert, nachdem du MIOS aufgespielt hast? ;D Vielleicht hat ja alles geklappt. Spiel doch mal die passende Applikation auf (du hast nicht erwähnt um was es sich handelt: MB64, Seq, SID...). MIOS ist ja nur das "Betriebssystem". Ist klar, dass da nix weiter passiert... Grüße, Michael
  6. you know that there's a MIDIbox speakJet project? see userProjects -> SpeakJet (Forum and/or Wiki) Regards, Michael
  7. just found QCad: http://www.ribbonsoft.com/qcad.html It's a commercial product (25 $), but the source is GPL'ed. Anyone ever tried this? Cheers, Michael
  8. yeah, this link came up somewhen before :) but thanks for your notification! Though I'm especially proud of: - MB Speakjet / kII is free! - the current material costs are approx. 40 US$ to 100 US$, depending on which controls are used - kII has a very crazy handTracker interface which behaves very different from the FLAME joystick. Whereas the joystick is triggering only the available sounds; kII has a scientific phoneme table with jaw and tongue controls. These controls are also available by Midi, so you don't necessarily need a handTracker device (or can attach something else!) - kII has no sequencer; but as I'm a realtime-control freak: kII has an auto-synced quantizer - and kII has an integrated harmonizer btw Here's another work-in-progress video: I enhanced the Midi-Output and set up an Ableton-Live Set. Everything you see/hear is realtime interactive, no editing. Just one SpeakJet, three beat-samples (filtered, volumed) and two Operator-Instances (Note-On output by kII), harmonization and quantization from kII, clock from Ableton Live. besides these enhancements, I'm already working on improved env/synth control on suggestions by Rio, overworked the kII services routine (timed phrase trigger, auto-cleanup). With the new timed event features, it is also very (very) likely that there will be real support for PIC internal phrases / recordings (not the ones inside the SJ)... 8) ... a bit of competition seems to be the best reason to keep things going, eh' ;D Cheers, Michael
  9. it looks like (rubber) caps on simple tactile switch buttons. so you just have to search the right caps for the switches of your choice. I recommend to order a test-pair before spending lots of money on 100 pieces that don't fit in the end ;) best regards, Michael
  10. hey stryd, I remembered this topic when I just stumbled upon a self-recursive function I wrote which I'm using for quite some time now without any problems: ///////////////////////////////////////////////////////////////////////////// // send PANIC! If channel > 15 send panic on all channels (self recursive) ///////////////////////////////////////////////////////////////////////////// void ACMidi_SendPanic(unsigned char channel) __wparam { unsigned char c; if(channel > 15) { // send panic on all channels for(c=0; c<16; c++) { ACMidi_SendPanic(c); } } else { // send panic MIOS_MIDI_BeginStream(); MIOS_MIDI_TxBufferPut(MIDI_CC + channel); MIOS_MIDI_TxBufferPut(MIDI_CC_ALL_NOTES_OFF); // CC 123: ALL NOTES OFF MIOS_MIDI_TxBufferPut(0x00); MIOS_MIDI_EndStream(); } } as far as I can see (which is not very far in ASM ;D ) the generated ASM code looks nice, too: ;-------------------------------------------------------- ; global & static initialisations ;-------------------------------------------------------- ; I code from now on! ; ; Starting pCode block S_ACMidi__ACMidi_SendPanic code _ACMidi_SendPanic: ; .line 91; ACMidi.c void ACMidi_SendPanic(unsigned char channel) __wparam MOVFF FSR2L, POSTDEC1 MOVFF FSR1L, FSR2L MOVFF r0x00, POSTDEC1 MOVFF r0x01, POSTDEC1 MOVWF r0x00 ; .line 94; ACMidi.c if(channel > 15) { MOVLW 0x10 SUBWF r0x00, W BNC _00125_DS_ ; .line 96; ACMidi.c for(c=0; c<16; c++) { CLRF r0x01 _00127_DS_: MOVLW 0x10 SUBWF r0x01, W BC _00131_DS_ ; .line 97; ACMidi.c ACMidi_SendPanic(c); MOVF r0x01, W CALL _ACMidi_SendPanic ; .line 96; ACMidi.c for(c=0; c<16; c++) { INCF r0x01, F BRA _00127_DS_ _00125_DS_: ; .line 101; ACMidi.c MIOS_MIDI_BeginStream(); CALL _MIOS_MIDI_BeginStream ; .line 102; ACMidi.c MIOS_MIDI_TxBufferPut(MIDI_CC + channel); MOVLW 0xb0 ADDWF r0x00, F MOVF r0x00, W CALL _MIOS_MIDI_TxBufferPut ; .line 103; ACMidi.c MIOS_MIDI_TxBufferPut(MIDI_CC_ALL_NOTES_OFF); // CC 123: ALL NOTES OFF MOVLW 0x7b CALL _MIOS_MIDI_TxBufferPut ; .line 104; ACMidi.c MIOS_MIDI_TxBufferPut(0x00); MOVLW 0x00 CALL _MIOS_MIDI_TxBufferPut ; .line 105; ACMidi.c MIOS_MIDI_EndStream(); CALL _MIOS_MIDI_EndStream _00131_DS_: MOVFF PREINC1, r0x01 MOVFF PREINC1, r0x00 MOVFF PREINC1, FSR2L RETURN So, at least we have a working example here. I know there could be optimisations with Begin- and EndStream(), but... what the heck, it works... :) Cheers, Michael
  11. I don't think, you need to hack any dll's ;)
  12. Hallo Rio, schnell ein kurzes Zwischen-Update: ich habe mit Seppoman gechattet und ich glaube, ich sehe jetzt ein wenig klarer :) Ich bin gerade ziemlich knapp mit meiner Zeit (Semesteranfang, viel Arbeit und eine neue Ausstellung...). Ich werde mich in einigen Tagen (spätestens in vier Wochen) mit einer kurzen Liste melden, welche Synthie-Funktionen ich in das Programm aufnehme. So wie es aussieht, sollten damit deine Ideen umzusetzen sein und der Programmier-Aufwand dafür scheint nicht sehr groß. :) Mehr in Kürze! Grüße, Michael
  13. yeh baby! give us some F@*&'n funky tribal subclocked polygroooves!
  14. Yes, the Clockbox v 1.1. can do that: http://www.midibox.org/forum/index.php?topic=5691.msg48932#msg48932 (and ucapps.de -> download) Regards, Michael
  15. Absolutely! cheers for explaining this! r0x37 is indeed ...wooo, quite a number... As mentioned, in the kII Midi-Receive Function, I have mixed simple calls, if-statements and very long sub-switches (eg. [tt]switch(msgType) { case MIDI_CC: switch(MIDI_CC) { case CCBankselect: ...[/tt] ) I counted roughly 40 to 50 cases alone for the CC case statement (sub-switch-routine), and I found just 13 r0x*** registers. that's good, eh'? 8) Great to know about that, thanks again, stryd :)
  16. yeah, that's what I already wrote: go to the folder /tools/ (inside your project), search for mkmk.pl and set chmod permissions to be executeable. regards, Michael
  17. you don't need to go to the bin-folder for the makefile generator. There's just a perl script (tools/mkmk.pl) involved. So, you should make sure that these files are: - readable: yourproject/MAKEFILE.SPEC - executeable: yourproject/tools/mkmk.pl does this help?
  18. SDCC generates ASM-files in the "_output" directory. So whenever there's a problem, you can find the ASM here: _output/myfilename.asm In your case, you can upload it on the chip and see if it works. You might inspect the details only if you encounter any problems. Edit: beaten by stryd :P @stryd: have you seen my question about the number of rx0***'s ?
  19. just leave them ;) Cheers, Michael
  20. hm, how may r0x*** registers may there be? Does that mean, if too much temp registers are needed, it won't fit into the available RAM? (Background: I have about 40 swich cases in a nested "super-"switch case and can see r0x0C right at the beginning of the function in the .asm file (_output). 13 r0x***es don't seem much for the incredible amount of C-Code I wrote there... sorry stryd, if this question is somehow dumb, but if you go into details, I wanna know it really detailed :-* ;) @jsflint: don't want to confuse you, sorry :)
  21. stryd means, that the asm code generated by sdcc is smaller if you call functions from a switch case. but I don't think it makes any difference here – it may even get a bit more complicated for you, 'cause there's more to type. I don't think you really need to care about this level of optimisation for the purpose of your application; the PIC won't be overloaded with 8 knobs and 8 leds ;) (of course it can't hurt having heard about things like these...) cheers, Michael
  22. Just a quick note for all those who are wating for the next sensorizer: while the kII/SpeakJet beta gets (hopefully) tested by somebody, I got some time to apply a few very cool features to the Sensorizer. It has now full quantisation support (and improved harmonisation). So it's possible to either send CC's or note events (both quantized! different quantize-vales for each sensor, of course!, selectable scales). Now I only have to fix some bugs ;D and implement NOTE_Offs... shouldn't take that long anymore... Stay tuned! Cheers, Michael
  23. Hallo Rio, 2x16 wird noch nicht unterstützt; bei mir hängt momentan ein 2x8 dran aber danke für den Hinweis. findest du in "IIC_SPEAKJET_MidiDefines.h"; wenn _TGL (Toggle) meint: weiterschalten (<64/>64), ansonsten den Wert mit evnt2 setzen. Damit sollten alle Envelope-Settings einfach und detailliert anzusteuern sein. // ENV controls #define SJCC_ENV_OSC_A 53 // ENV on/off for OSCs 1 to 3 #define SJCC_ENV_OSC_B 54 // ENV on/off for OSCs 4 and 5 (half enveloped only) #define SJCC_ENV_OSC_TGL 52 // toggle ENV on/off for OSC groups (00, 01, 10, 11) #define SJCC_ENV_WAVESHAPE 116 // set ENV Waveshape 1:0..31, 2:32..63, 3:64..95, 4:96..127 #define SJCC_ENV_WAVESHAPE_TGL 51 // switch to next envelope waveshape, also see SJCC_ENV_TYPE #define SJCC_ENV_FREQ 106 Ach das meinst du, ich meinte den Synth-Modus wenn der Harmonizer zugeschaltet ist (der ist bei dir auch noch drin, zwar anders, aber noch vorhanden). Beispiel: NoteA ist durch die Harmonisierung die gleiche wie NoteB => A down (an) -> A up (aus) -> B down (an) -> B up (aus) => OK A down (an) -> B down (noch an) -> A up (aus) -> B noch down aber kein Ton => Falsch Das ist nun behoben. Das was Du meinst (haben wir aber schon mal weiter vorne im Thread besprochen), ist ein Feature um die Allophone abzukürzen und um sie "in-Time" spielen zu können: Phoneme werden im MSA Modus übertragen und im Input Buffer gespeichert, und dann nacheinander abgespielt. Jedes Phonem hat eine definierte Dauer (siehe Datasheet). Wenn man nun zügig hintereinander mehrere Tasten drückt, kommt es spätestens ab dem dritten Phonem zu einem merklichen Zeitversatz. Deshalb wird beim Note-Off ein MSA_Stop() gesendet, der Buffer wird geleert und alles ist Echtzeit. Solltest du nun einmal eine Taste extrem schnell loslassen, kann es zu einem Hänger kommen, wahrscheinlich weil der Buffer gelöscht wird (sofort per SCP-Command) und das mit einem gepufferten MSA-Kommando zusammenfällt. Ich werde mir das bei Gelegenheit genauer ansehen (denke, dass man das u.U. auch beheben kann). Man kann natürlich auch einen neuen Channelmode mit gepufferter Übertragung ohne Stop anlegen... Ich habe ein mp3 der Oszillatoren erst ohne, dann ENV_OSC1-3, dann halbENV_OSC4-5, dann OSC1-5 ENV angehängt. Und das für alle OSCs (also insgesamt 4 * 5 snippets). :o Oh mann, ich glaube, ich habe gerade kapiert, was du meinst: Ich dachte die ganze Zeit du meinst das Knacksen in der OSCSynthese (das ich ja jetzt gefixt habe) – das was du als "Knackser" bezeichnest, ist ganz normal, wenn kein Envelope zugeschaltet ist. Eine oszillierende Sinuswelle fängt ja nicht immer bei 0 an! D.h. die Welle oszilliert vor sich hin (im Chip gibt's einen Quartz, der den Takt gibt) und dann wird eine Frequenz gesetzt und die Lautstärke angemacht; wenn die Welle nun nicht am Nullpunkt, sondern in einem anderen Schwingungsstartpunkt "angeht", dann ist das u.U. als Geräusch hörbar; so wie wenn du eine Audiodatei/Wellenform nicht am Nullpunkt schneidest, sondern mittendurch! So, jetzt kommt das beste: Die Übersetzung des Wortes "Envelope" ist Hüllkurve. Mit deinem "Volume-Ramping" machst du also nichts anderes einen Envelope zu programmieren - als "Workaround" für einen "Bug" der keiner ist! Und du darfst ja nicht vergessen, dass ein OSC eine ganz einfache, super-simple Frequenz-Modulation ist. Ich weiß natürlich nicht, was du alles von elektronischer Klangsynthese verstehst (bei mir hält sich das Wissen in Grenzen), aber wir reden hier über einen super billigen Oszillator aus einem 25$ Sprachchip... du kannst das schlecht mit richtigen Synthies vergleichen; da hört man im Normalfall ja nicht einen einzigen Oszillator, sondern eine komplexe Synthese aus mehreren Oszillatoren, Filtern und Envelopes mit komplexen zeitbasierten Hüllkurven-Steuerungen! Also, wenn dir der integrierte Envelope nicht ausreicht, dann wäre es sinnvoller gleich was richtiges zu programmieren. Mit dem ACSyncronizer könnte man jetzt nämlich eine richtig krasse, zeitlich basierte (rhythmische) Hüllkurven hinzufügen. Wo und wann genau passiert das? Auf welchem Kanal? Ist der Handtracker aktiv? Ist der Garbage-Collecor aktiv? Wenn der Garbage-Collector aktiv ist, dann nimm doch die andere vorkompilierte .syx-Datei (kII_0.2.4.noMessages.syx). Du musst diese Pins miteinander verbinden: SJ:D2 (BufferHalfFull) -> Core:J14 Wenn keine Verbindung besteht, ist der Puffer einfach niemals halb voll. Naja, dazu kommt, dass dein Mod zusätzlich zu meinen alten auch noch neue bugs bekommen hat. Genau hierin sehe ich auch eines der größten Probleme, wenn du einen mod veröffentlichst: nämlich, dass alte Bugs weiterbestehen und neue Bugs hinzukommen: 1. Note-ON/OFF bug, harmonizer (s. oben) 2. und mir sind die Harmonischen in der OSCSynthese aufgefallen. Ich weiß nicht warum du da was geändert hast (oder ob das urspünglich mein Fehler war): f[0] = freqOfNote[value]; f[1] = f[0] << 1; f[2] = f[1] + f[0]; // f[0] + f[0], nicht f[1] + ff[0] f[3] = f[0] << 2; f[4] = f[3] + f[0]; // 3, nicht 2 f[5] = f[0] << 3; f[6] = f[5] + f[0]; // 5, nicht 4 f[7] = f[0] << 4; f[8] = f[7] + f[0]; // 7, nicht 6 3. Und noch ein Wort zu dem von dir beschriebene Effekt deines Mods (dass es bei höheren Werten mit best. ENV laut zu krachen beginnt). Ich habe mal genau nachgerechnet, wieviele SCP Bytes bei deiner Funktion gesendet werden und bin auf Werte zwischen 20 bis (im Worst Case) mehrere Hundert (!) gekommen. Ich schätze die Wahrscheinlichkeit ziemlich groß ein, dass du den Chip mit seinem 64-byte Puffer einfach überforderst. Ich meine, ist ja klar, dass es Bugs gibt, wo gibt's die nicht. Aber findest du das wirklich sinnvoll, zwei buggy Versionen rauszuhauen? Sollte man nicht lieber gemeinsam an einer richtig guten Version ohne Bugs arbeiten? also, alle OSCs haben eine bestimmte Frequenz und dann machst du nur die Lautstärke an/aus... verstehe ich das richtig? Kannst du das noch genauer beschreiben? Ich meine, im Moment kann man NOTE_Ons senden um gestimmte Frequenzen zu erzeugen, ungestimmte Frequenzen kann man per CC wählen. Alle OSCs und der ENV sind per CC separat in Frequenz und Lautstärke einstellbar. Insofern sollte das was du vorhast, ziemlich einfach mit einer entsprechend aufgebauten Midibox zu steuern sein oder aber als gut verkapselte neue Funktion. Das mit den Envelopes geht ja jetzt alles. Auch das ist (und war immer) möglich. Drücke eine Taste und dann ändere die OSCs per CC (101-105 und 111 bis 115). Außerdem steht auf meiner Prio-Liste noch die Unterstützung des CC# MIDI Pedal-Hold... Ich nehme an, du meinst den MSA_Stop(); allerdings weiß ich nicht, was du damit meinst, da alle Synthie-Steuerungen per SCP übertragen werden und MSA_Stop() nur für das Phonem-Triggering per Tasten benutzt wird (m.a.W. es gibt in meinem Code kein MSA_Stop() in Verbindung mit OSCs) ??? und workaround für was? Für die "Knackser" am Anfang? hab' ich auch nicht verstanden. Aber es würde bedeuten, dass die Velocity des Anschlags flöten geht :-\ Versteh' ich nicht... genau das finde ich aber nicht gut. Das meinte ich im letzten Post mit ("die subtraktive Synthese zu etwas machen, das sie nicht ist"). Du bist dabei, eine Funktion mit etwas komplett anderem zu vermischen, das ist weder gut anzuwenden, noch sinnvoll zu programmieren. Arnie Schwarzenegger hat Unrecht, wenn er empfiehlt: "Mix it, Baby!" IMHO ist das ja die Haupt-Arbeit am Programmieren: das Aufbrechen von Aufgaben in sinnvolle, von einander getrennte Bereiche. Was spricht denn konkret dagegen, das in einer _eigenen_ Funktion zu realisieren, anstatt eine andere zu verhutzeln, die etwas ganz anderes sein möchte. Warum malst du den Apfel rot an, wenn du auch eine Kirsche dazu haben kannst... weißt du was ich meine? - eine Funktion - einen main.c-call - ein oder zwei lokale Variablen - und ein paar Defines Das nehme ich dann, kopiere es und fertig ist die neue RIO-Synthese im offiziellen Release :) Bisher kann ich nur Sachen rauslesen, die alle gehen sollten (außer das Pedal/Hold) oder deren Zweck ich nicht kapiere (siehe Missverständnis Knacken <-> Envelope). Auf jeden Fall bemühe ich mich, dass wir soweit übereinkommen, dass du den Chip mit deiner K64 benutzen kannst. Viele Grüße, AC kII_OSC_test_070414.mp3 kII_OSC_test_070414.mp3
  24. I saw that Wilba gave you the answer how you can do this without sprintf: http://www.midibox.org/forum/index.php?topic=8995.msg63932#msg63932 regards, Michael
  25. Hi jeb, no, there is no problem with the linker, there is a problem with your code. you haven't read the libsdcc.lib README.txt from TK, haven't you? :P ;) ;) 1) printf prints a string to the console/a file/the buffer. what console/file/buffer exactly do you want to use on the PIC18F? 2) if you can avoid it, don't use the lib. as you just found out, it blows the code extremely. I coded a lot for mios, but I never ever have been in the situation to need the lib. regards, Michael
×
×
  • Create New...