-
Posts
4,313 -
Joined
-
Last visited
-
Days Won
3
Content Type
Profiles
Forums
Blogs
Gallery
Everything posted by nILS
-
What I think really helps reduce the amount of cables is to have a combined frontpanel-din-dout-pcb. A lot of layouting to do, but you'll only have 9 lines going from the master core to the CS-pcb. I saw an interesting idea around the forum, that I have been toying with as well. Instead of having those 4 sections (OSC, ENV, LFO, FILTER) which are all fairly similar, you could just make one section with the maximum amount of buttons/encoders needed for each section and add a selection button + 4 LEDs. Basically the max. amount for each section is: 5 encoders (OSC + ENV) + Button and 3 LEDs for selection of enc function 1 Button + 6 Select LEDs (LFO) 1 Button + 5 LEDs (LFO -> Waveform) 1 Button + 2 LEDs (OSC) Doing this would reduce the amount of encs/buttons/leds on the front panel to about a third.
-
Hiya and welcome aboard! Voltages of 5.06V are fine. Check the following: - Solderings REALLY okay? No bridges? - Voltages everywhere? Not just on some part of the board? - MIOS (or at least the Bootstrap loader) on the PIC? If the answer to all these is "yes" your optocoupler may actually be dead. I take it these are fairly easy to kill.
-
pollin.de has some. Since you're from France, that should work shipping-wise as well.
-
Get off my damn lawn!
-
/tilted/: Right. We could do that, but since there are 2x[desiredMhz] and 8x[desiredMhz] oscillators all over the place I don't think, that this will be necessary. I'll probably replace the Dual Flip Flop with Quad Flip Flop and some jumpers to allow using 1x, 2x, 4x and 8x [desiredMhz] oscillators. It's a matter of taste really. But this should give us enough room to optimize the circuit =)
-
Zur Komplett-softwarelösung: Ich hab sowas mal gebaut indem ich einfach eine Zusatztaste (eine von den sinnlosen "Internet", "Email" oder Lautstärke tasten die die meisten Tastaturen haben) als Ein/Aus-Schalter für die Zusatzfunktionen genommen hab. Einmal auf "Internet" drücken, Sonderfunktionen an, nochmal drück Sonderfunktionen aus. Dann einen Windows-Hook, der die Tastaturereignisse abfängt bevor sie an die Programme verteilt werden. Wenn der Sondermodus aus ist, nix machen, ansonsten Taste nehmen, in ein MIDI Event umwandeln und das an einen MIDIInput am Rechner schicken. Fertig. Geht ganz toll, limitiert einen allerdings völlig auf Taster. Mit einer MidiBox hast Du den immsensen Vorteil auch Potis, Drehimpulsgeber, Fader und derlei zu verbauen. Außerdem kannst Du Dir nette Presets bauen und bist einfach viel flexibler. Auch was die Größe des Controllers angeht. Schau doch mal hier im Forum unter "MIDIbox of the Week" da sind ein paar sehr nette Lösungen bei. Die Preise für die Module findest Du bspw. bei Mike oder SmashTV im Shop. Hab grad nur Smash's link parat: http://www.avishowtech.com/mbhp/buy.html
-
So far what's happened is I took the source from the SID v1.7303 (sid_sr.inc) and thinned it out a bit (taking out the WT and reducing it to the 10 registers needed). This is the result so far: ; ; MIDIbox POKEY ; POKEY Shift Register Service Routine ; ; ========================================================================== ; ; Copyright 1998-2006 Thorsten Klose (tk@midibox.org) ; Licensed for personal non-commercial use only. ; All other rights reserved. ; ; ========================================================================== ; ; define the pins to which the MBHPS_POKEY module is connected ; SID_SR_LAT_SCLK EQU LATD SID_SR_PIN_SCLK EQU 5 ; Pin D.5 SID_SR_LAT_RCLK EQU LATC SID_SR_PIN_RCLK EQU 4 ; Pin C.4 SID_SR_LAT_OUT EQU LATD SID_SR_PIN_OUT EQU 6 ; Pin D.6 SID_SR_LAT_WR EQU LATC SID_SR_PIN_WR EQU 5 ; Pin C.5 ;; -------------------------------------------------------------------------- ;; Initialize the MBHP_POKEY module ;; -------------------------------------------------------------------------- SID_SR_Init ;; reset the POKEY clrf MIOS_PARAMETER1 clrf MIOS_PARAMETER2 call SID_SR_Write movlw 0x0F movwf MIOS_PARAMETER1 movlw 0x03 movwf MIOS_PARAMETER2 rgoto SID_SR_Write ;; reset will be released with first call of SID_SR_Handler ;; -------------------------------------------------------------------------- ;; Check for changes in POKEY registers, transfer values to SID ;; -------------------------------------------------------------------------- SID_SR_Handler IFSET SID_STAT, SID_STAT_ENGINE_DISABLE, return _SID_SR_Handler SID_SR_Start TABLE_ADDR SID_SR_REGWRITE_TABLE ; contains order of register accesses movlw 0x0A ; number of registers (0x0A) movwf TMP1 ; TMP1 is the loop counter lfsr FSR0, SID_BASE ; store base address of SID registers in FSR0 lfsr FSR1, SID_SHADOW_BASE ; store base address of shadow registers in FSR1 IRQ_DISABLE ; disable interrupts SID_SR_Loop tblrd*+ movf TABLAT, W movff PLUSW0, MIOS_PARAMETER2 ; store value of SID in MIOS_PARAMETER1 and increment FSR0 IFSET SID_STAT, SID_STAT_FORCE_REFRESH, rgoto SID_SR_Transfer; don't skip if refresh has been forced movf PLUSW1, W ; get content of appr. shadow register IFNEQ MIOS_PARAMETER2, ACCESS, rgoto SID_SR_Transfer ; transfer to SID if not equal rgoto SID_SR_Next ; skip following code if equal SID_SR_Transfer ;; register change: write value into shadow register and transfer it to SID movf TABLAT, W movff MIOS_PARAMETER2, PLUSW1 ; store value in shadow register movf TABLAT, W ; extract address offset iorlw 0xe0 ; (note: reset line must stay 1) movwf MIOS_PARAMETER1 ; store in address register rcall SID_SR_Write ; transfer to SID SID_SR_Next decfsz TMP1, F ; decrement loop counter until it is zero rgoto SID_SR_Loop return ;; -------------------------------------------------------------------------- ;; SID Write: write to SID register ;; -------------------------------------------------------------------------- SID_SR_Write ;; SID signals: ;; MIOS_PARAMETER2[7..0]: Data ;; MIOS_PARAMETER1[4..0]: Address ;; MIOS_PARAMETER1[5] : Reset ;; temporary used as counter: MIOS_PARAMETER3 bcf SID_SR_LAT_SCLK, SID_SR_PIN_SCLK ; clear clock ;; superfast transfer with unrolled loop (takes some memory, but guarantees the ;; lowest system load :) SID_SR_WRITE_BIT MACRO reg, bit bcf SID_SR_LAT_OUT, SID_SR_PIN_OUT ; set out pin depending on register content (reg.bit) btfsc reg, bit bsf SID_SR_LAT_OUT, SID_SR_PIN_OUT bsf SID_SR_LAT_SCLK, SID_SR_PIN_SCLK ; rising clock edge bcf SID_SR_LAT_SCLK, SID_SR_PIN_SCLK ; falling clock edge ENDM SID_SR_WRITE_BIT MIOS_PARAMETER2, 0 SID_SR_WRITE_BIT MIOS_PARAMETER2, 1 SID_SR_WRITE_BIT MIOS_PARAMETER2, 2 SID_SR_WRITE_BIT MIOS_PARAMETER2, 3 SID_SR_WRITE_BIT MIOS_PARAMETER2, 4 SID_SR_WRITE_BIT MIOS_PARAMETER2, 5 SID_SR_WRITE_BIT MIOS_PARAMETER2, 6 SID_SR_WRITE_BIT MIOS_PARAMETER2, 7 SID_SR_WRITE_BIT MIOS_PARAMETER1, 0 SID_SR_WRITE_BIT MIOS_PARAMETER1, 1 SID_SR_WRITE_BIT MIOS_PARAMETER1, 2 SID_SR_WRITE_BIT MIOS_PARAMETER1, 3 SID_SR_WRITE_BIT MIOS_PARAMETER1, 4 SID_SR_WRITE_BIT MIOS_PARAMETER1, 5 SID_SR_WRITE_BIT MIOS_PARAMETER1, 6 SID_SR_WRITE_BIT MIOS_PARAMETER1, 7 bsf SID_SR_LAT_RCLK, SID_SR_PIN_RCLK ; latch SID values bcf SID_SR_LAT_OUT, SID_SR_PIN_OUT ; clear out pin (standby) bcf SID_SR_LAT_RCLK, SID_SR_PIN_RCLK ; release latch ;; synchronize with rising edge of SID clock to avoid setup or hold violation ;; note: due to pipeline effects, the "bcf" will be executed 3 instruction cycles after ;; the polling loop. Therefore we are waiting for the falling edge IFCLR PORTC, 2, bra $-2 ; wait for falling clock edge IFSET PORTC, 2, bra $-2 bcf SID_SR_LAT_WR, SID_SR_PIN_WR ; enable write (MBHP_SID: chip select) bra $+2 ; to ensure compatibility with on-board oscillator, bra $+2 ; wait for 1.2 uS (> one SID clock cycle) bra $+2 bra $+2 bra $+2 bra $+2 bsf SID_SR_LAT_WR, SID_SR_PIN_WR ; disable write (MBHP_SID: chip select) return ;; -------------------------------------------------------------------------- ;; SID Phase sync: called by the SID_SR_Handler after a register update ;; expects pointer to SID_Vx_CTRL in FSR0 and to the appr. shadow register in FSR1 ;; checks if test bit set - if so, clears the test bit, sets the gate bit ;; and transfers the updated control register to the SID ;; -------------------------------------------------------------------------- SID_SR_OscPhaseSync IFCLR INDF0, 3, return ; no phase sync if test bit not set bcf INDF0, 3 ; clear test bit bsf INDF0, 0 ; set gate bit ;; transfer new value into shadow register movf INDF0, W ; transfer new value into shadow register movwf INDF1 ;; and transfer it to the SID movwf MIOS_PARAMETER2 ; data movf FSR0L, W ; extract address offset addlw -(SID_BASE & 0xff) iorlw 0xe0 ; (note: reset line must stay 1) movwf MIOS_PARAMETER1 ; address rgoto SID_SR_Write ;; -------------------------------------------------------------------------- ;; This routine writes to the SR register ;; used by SID_SW_Note in sid_sw.inc ;; expecting offset to AD register in WREG, and data in MIOS_PARAMETER2 ;; -------------------------------------------------------------------------- SID_SR_Write_SR iorlw 0xe0 ; refresh SID AD register movwf MIOS_PARAMETER1 ; address rgoto SID_SR_Write ;; -------------------------------------------------------------------------- SID_SR_REGWRITE_TABLE ;; order in which the SID registers are written ;; note that the control register (which contains the gate flag) is not written before ;; the other OSC registers have been initialized db 0x01, 0x00, 0x03, 0x02, 0x05, 0x04 db 0x07, 0x06, 0x08, 0x0F, 0x0c, 0x0d [/code]
-
jimp, you are an evil and mean person =)
-
At the moment I'm trying to set up the Core -> Pokey module data transfer. I figure it's going to be similar to what TK did in the SID app. Buuuut, I'm kinda stuck. So here's for all code gurus: The parallel output source: #define ACTIVE 0 #define INACTIVE 1 #define STROBE 2 #define PORT 0x378 #define PORTCONTROL PORT #define PORTDATA PORT + 1 void WritePokey(unsigned char addr, unsigned char byte) { PLatchAddress(addr); PLatchData(byte); PChipSelect(STROBE); } void PLatchData(unsigned char val) { Pokey_Out(PORTCONTROL, 0); Pokey_Out(PORTDATA, val); Pokey_Out(PORTCONTROL, 2); Pokey_Out(PORTCONTROL, 0); } // PLatchData void PLatchAddress(int add) { Pokey_Out(PORTCONTROL, 0); Pokey_Out(PORTDATA, add); Pokey_Out(PORTCONTROL, 8); Pokey_Out(PORTCONTROL, 0); } // PLatchAddress void PChipSelect(int mode) { if (mode == INACTIVE) Pokey_Out(PORTCONTROL,0); if (mode == ACTIVE) Pokey_Out(PORTCONTROL,1); if (mode == STROBE) { Pokey_Out(PORTCONTROL,1); Pokey_Out(PORTCONTROL,0); } } // PChipSelect[/code] This is basically what I need to port to serial output for the Core. Any pointers would be greatly appreciated =)
-
That reminds me of an old ROLAND sound canvas I once had =)
-
Das kommt ganz auf die Tastatur an, die du verwendest. Die meisten gängigen und vor allem günstigen Tastaturen haben keine echten Taster verbaut, sondern nur zwei Folien mit Kontakten, die bei einem Tastendruck aufeinandergepresst werden. Ist vom "Gefühl" beim betätigen nicht so dolle, aber sicher geschmackssache und sicherlich auch vom Ziel abhängig. Desweiteren verwenden im Tastaturen Matrizen, d.h. eine ganze Reihe von Tasten hängt an der gleichen Masse und schaltet den Strom an/aus. Infos dazu gibt's bspw hier: http://www.dribin.org/dave/keyboard/html/martix-circuit.html Ich persönlich würde Dir raten, das Bedienfeld selber zu bauen. Erstens, weil's Spass macht, zweitens, weil Du dann ganz genau das kriegst, was Du willst und drittens, weil es weniger Eigenentwicklung bedarf. Schau Dir am besten mal bei ucapps die Module Core (brauchst Du 1x): http://ucapps.de/mbhp_core.html DINx4 (brauchst Du min. 1x): http://ucapps.de/mbhp_din.html Jedes DIN Modul unterstützt 32 Buttons. Solltest Du eine Button Matrix bauen (nicht mehr alle Tasten gehen gleichzeitig) geht natürlich mehr. Insgesamt kann man IMHO max. 4 solcher Module an einen CORE anschliessen, das brächte Dir also 128 Taster. Das wäre im Prinzip alles. Oft bietet es sich an auch ein LC Display zu haben. Da ich nicht weiss, was genau Du vorhast kann ich im Moment dazu nichts genaueres sagen. Beschreib Dein Projekt einfach ein bissel genauer, dann wird das schon =)
-
It's really amazing how every time I see a picture of Wilba's SID it makes me want to become a daytime hooker to get the money to built one asap ;D
-
Welcome aboard :) I believe after reading through ucapps and finding your way here, you'll find it is much easier than you might think at first =)
-
It's a hidden code! :o TK is trying to tell us sth!
-
The attachment is an excel table that calculates the output frequency depending on the crystal. Possible values for columns A and E are B2 / 28, B2 / 114 and B2 (for the left side, atm being PAL) B2 is the clock frequency. Happy fiddling tilted =) Pokey_Note_Table.zip Pokey_Note_Table.zip
-
I should have put "extensively" or something similar in that sentence :D
-
Yes, we've discussed that in the chat. There's no need to use a 14.318Mhz crystal and divide it by 8 (for instance by using 3 flip flops), since 3.579545Mhz oscillators are widely available and only need to be divided by two (one flip flop) as seen in the first schematic. Using a crystal and building an oscillator circuit has been discussed as well, but it doesn't really lead to any better results as basically all crystal "speeds" come as oscillators, as well. So, the bottom line is that I think adding a single IC (a dual D-Flip-Flop (i.e. 74HC74)) to the circuit is the best and easiest solution.
-
Grundlegend wirft Dein Post für mich eine ganz große Frage auf: Am USB-Port oder per MIDI? Wenn MIDI: Ja. In dem Fall würdest Du eine MIDIBox bauen und wärst hier genau richtig. Als erstes solltest Du dann gaaaanz viel lesen und zwar hier: ucapps.de Wenn USB-Port: Ja. Allerdings brauchste dann garkeinen großen Aufwasch machen. Dann nimmst Du die Tastatur (ist ja eine Apple Tastatur und somit ohnehin USB) schreibst ein bissel Software und fertig is'.
-
The ALDI C64 - I have one of these, too =)
-
I finally put sth. in the wiki (http://www.midibox.org/dokuwiki/midibox_pokey). It needs to and will be extended :) For everyone interested, the first of the pictures below shows what the preliminary version of the mbPokey board looks like. A later version will probably sport a serial out to allow for multiple pokeys. The second one is a picture of the schematic that shows how to hook up a pokey to a printer port on a PC (this is the schematic assuming a 1.77Mhz or 1.79Mhz crystal. It works "kinda" well with a 1.8432Mhz crystal, which is widely available). EDIT: Some feedback on the first schematic would be greatly appreciated.
-
Just in case this turns out to become some sort of poll. I fully agree with seppoman. Two locations for the same thing = evil chaos.
-
I found the answer in some anonymous D'N'D blog:
-
jaicen: "More or less" is exactly the problem. I really wanted to go for "more" rather than "less" The pokey uses a divide-by-n counter to generate the output frequency from the oscillator it's clocked with. Therefore, there's a direct correllation between Fosc and Fout. In "default mode" the clock frequency gets internally divided by 28 leaving you with ~64kHz as Finternal. The formula for the output frequency in that case is rather simple: Fout = Finternal / (AUDF+1) * 2 AUDF being a register holding a byte determining the frequency. Even though the difference in the Finternal is rather small between NTSC and PAL (633337.39Hz for PAL, 63920.45Hz for NTSC), NTSC tends to be a little bit more off. Not enough to justify going through custom-crystal-shaving or anything like that though.