Any trick to learn all types of systolic and diastolic murmer

HOCM, Ejection (AS/PS), Late systolic (MVP), Pansystolic/Holo (MR, TR, VSD), Mitral valve prolapse click, VSD
| Condition | Location | Radiation | Trick to Remember |
|---|---|---|---|
| Aortic Stenosis (AS) | Right 2nd ICS (aortic area) | Carotids | "AS radiates to the neck (it's going up)" |
| Pulmonary Stenosis (PS) | Left 2nd ICS | Left shoulder | "PS stays on the left" |
| HOCM | Lower left sternal border | Does NOT radiate to carotids | "HOCM is stubborn - doesn't go up" |
| ASD | Left 2nd-3rd ICS | - | High flow across pulmonary valve - "ASD = A lot of flow across pulmonary area" |
| Condition | Location | Radiation | Trick |
|---|---|---|---|
| Mitral Regurgitation (MR) | Apex | Axilla | "MR goes to the arMpit (axilla)" |
| Tricuspid Regurgitation (TR) | Lower left sternal border | Right sternal border | "TR = Tricuspid = lower Tip of sternum; increases with inspiration (Carvallo's sign)" |
| VSD | Left sternal border 3rd-4th ICS | Entire precordium | "VSD is loud (grade 4-5) - small hole = big noise" |
Aortic regurgitation (early), Pulmonary regurgitation (early), Presystolic (MS in sinus rhythm), Yell "Rumble" for MS mid-diastolic
| Condition | Location | Best heard | Trick |
|---|---|---|---|
| Aortic Regurgitation (AR) | Left sternal border 3rd ICS | Leaning forward, breath held in expiration | "AR = forward lean to hear; blowing, high-pitched" |
| Pulmonary Regurgitation (PR) / Graham Steell murmur | Left 2nd ICS | Increases with inspiration | "Graham Steell = pulmonary HTN - think Eisenmenger" |
| Condition | Location | Special feature | Trick |
|---|---|---|---|
| Mitral Stenosis (MS) | Apex (bell) | Opening Snap then rumble; presystolic accentuation in sinus rhythm | "MS = OS then low rumble at apex" |
| Tricuspid Stenosis (TS) | Lower left sternal border | Increases with inspiration | "TS = like MS but on the right side" |
| Austin Flint murmur | Apex | Mid-late diastolic rumble in severe AR | "Flint = functional MS caused by AR jet hitting mitral leaflet" |
| Carey Coombs murmur | Apex | Mid-diastolic in acute rheumatic fever | "Coombs = rheumatic fever (Coombs sounds like rheumatic)" |
PDA, Mammary souffle, Arteriovenous fistula, Rupture of Sinus of Valsalva, Coronary AV fistula, Hum (venous hum in children)
| Timing | Type | Condition | Mnemonic |
|---|---|---|---|
| Systolic | Ejection (C-D) | AS, PS, HOCM, ASD | "ARPO" |
| Systolic | Pansystolic | MR, TR, VSD | "Mr. VSD" |
| Systolic | Late systolic | MVP | "Click then Rev" |
| Diastolic | Early (decrescendo) | AR, PR | "DAB" |
| Diastolic | Mid-late (rumble) | MS, TS, Austin Flint, Carey Coombs | "MATT Rumbles" |
| Continuous | Throughout cycle | PDA, AV fistula | "PDA MARCHes" |

Make a quick-reference PDF card with murmur mnemonics
ls /home/daytona/workspace/ 2>/dev/null && echo "---" && python3 -c "import repo…
mkdir -p /home/daytona/workspace/murmur-card
~/murmur-card/make_card.py
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.platypus import Table, TableStyle
from reportlab.lib.colors import HexColor
OUTPUT = "/home/daytona/workspace/murmur-card/Murmur_Quick_Reference.pdf"
# ── colour palette ──────────────────────────────────────────────
C_BG = HexColor("#0D1B2A") # deep navy background
C_HEADER = HexColor("#1E3A5F") # section header bar
C_ACCENT1 = HexColor("#E63946") # systolic red
C_ACCENT2 = HexColor("#457B9D") # diastolic blue
C_ACCENT3 = HexColor("#2A9D8F") # continuous teal
C_ACCENT4 = HexColor("#E9C46A") # gold for mnemonics
C_WHITE = colors.white
C_LIGHT = HexColor("#A8DADC")
C_DARK_ROW = HexColor("#132337")
C_MID_ROW = HexColor("#1A2E45")
W, H = A4 # 595.27 x 841.89 pt
MARGIN = 14 * mm
def hex_col(h):
return HexColor(h)
def make_card():
c = canvas.Canvas(OUTPUT, pagesize=A4)
c.setTitle("Heart Murmurs Quick Reference")
# ── BACKGROUND ───────────────────────────────────────────────
c.setFillColor(C_BG)
c.rect(0, 0, W, H, fill=1, stroke=0)
# ── TOP TITLE BAR ────────────────────────────────────────────
bar_h = 28 * mm
c.setFillColor(C_HEADER)
c.rect(0, H - bar_h, W, bar_h, fill=1, stroke=0)
# Red accent strip at very top
c.setFillColor(C_ACCENT1)
c.rect(0, H - 3.5 * mm, W, 3.5 * mm, fill=1, stroke=0)
c.setFillColor(C_WHITE)
c.setFont("Helvetica-Bold", 20)
c.drawCentredString(W / 2, H - 14 * mm, "HEART MURMURS — QUICK REFERENCE CARD")
c.setFont("Helvetica", 9)
c.setFillColor(C_LIGHT)
c.drawCentredString(W / 2, H - 21 * mm, "Mnemonics • Classification • Bedside Maneuvers | Harrison's 22E / Braunwald")
y = H - bar_h - 6 * mm # starting Y cursor
# ─────────────────────────────────────────────────────────────
# Helper functions
# ─────────────────────────────────────────────────────────────
def section_header(title, color, y_pos, icon=""):
c.setFillColor(color)
c.roundRect(MARGIN, y_pos - 7 * mm, W - 2 * MARGIN, 8.5 * mm, 3, fill=1, stroke=0)
c.setFillColor(C_WHITE)
c.setFont("Helvetica-Bold", 11)
c.drawString(MARGIN + 4 * mm, y_pos - 4.5 * mm, icon + " " + title if icon else title)
return y_pos - 9 * mm
def mnemonic_box(mnemonic, explanation, y_pos, color=C_ACCENT4):
box_h = 11 * mm
c.setFillColor(HexColor("#1A2D42"))
c.setStrokeColor(color)
c.setLineWidth(1.2)
c.roundRect(MARGIN, y_pos - box_h, W - 2 * MARGIN, box_h, 4, fill=1, stroke=1)
c.setFillColor(color)
c.setFont("Helvetica-Bold", 10.5)
label = f" Mnemonic: \"{mnemonic}\""
c.drawString(MARGIN + 3 * mm, y_pos - 5 * mm, label)
c.setFillColor(C_WHITE)
c.setFont("Helvetica", 8.5)
c.drawString(MARGIN + 3 * mm, y_pos - 9 * mm, explanation)
return y_pos - box_h - 2 * mm
def draw_table(data, col_widths, y_pos, row_colors=None):
"""Draw a simple table; returns new y position."""
row_h = 7.2 * mm
tbl_w = sum(col_widths)
x0 = MARGIN
default_row_colors = [C_DARK_ROW, C_MID_ROW]
for ri, row in enumerate(data):
is_header = (ri == 0)
bg = C_HEADER if is_header else default_row_colors[ri % 2]
if row_colors and ri < len(row_colors) and row_colors[ri]:
bg = row_colors[ri]
c.setFillColor(bg)
c.rect(x0, y_pos - row_h, tbl_w, row_h, fill=1, stroke=0)
# subtle separator line
c.setStrokeColor(HexColor("#253D57"))
c.setLineWidth(0.4)
c.line(x0, y_pos - row_h, x0 + tbl_w, y_pos - row_h)
xi = x0
for ci, cell in enumerate(row):
cw = col_widths[ci]
if is_header:
c.setFillColor(C_LIGHT)
c.setFont("Helvetica-Bold", 8)
else:
# First col bold white, rest normal
if ci == 0:
c.setFillColor(C_WHITE)
c.setFont("Helvetica-Bold", 8)
elif ci == 1:
c.setFillColor(C_ACCENT4)
c.setFont("Helvetica-Bold", 8)
else:
c.setFillColor(HexColor("#C8DCE8"))
c.setFont("Helvetica", 7.5)
c.drawString(xi + 2.5 * mm, y_pos - 5.5 * mm, str(cell))
xi += cw
y_pos -= row_h
return y_pos - 2 * mm
def bullet(text, y_pos, indent=0, color=C_WHITE, size=8, bold=False):
c.setFillColor(C_ACCENT4)
c.circle(MARGIN + indent + 2.5 * mm, y_pos - 2.5 * mm, 1.2, fill=1, stroke=0)
c.setFillColor(color)
fnt = "Helvetica-Bold" if bold else "Helvetica"
c.setFont(fnt, size)
c.drawString(MARGIN + indent + 5.5 * mm, y_pos - 4 * mm, text)
return y_pos - 5.5 * mm
# ─────────────────────────────────────────────────────────────
# SECTION 1 – SYSTOLIC MURMURS
# ─────────────────────────────────────────────────────────────
y = section_header("SYSTOLIC MURMURS", C_ACCENT1, y, icon="▶")
y -= 1 * mm
y = mnemonic_box("HELP MV",
"Hypertrophic (HOCM) • Ejection (AS/PS) • Late systolic (MVP) • Pansystolic (MR/TR/VSD) • Murmur (innocent) • VSD",
y, C_ACCENT1)
y -= 1.5 * mm
# Sub-header: Ejection
c.setFillColor(HexColor("#C1121F"))
c.setFont("Helvetica-Bold", 8.5)
c.drawString(MARGIN + 2 * mm, y - 1 * mm, "GROUP 1 — Ejection (Crescendo-Decrescendo) [ diamond-shaped ] Mnemonic: \"ARPO\"")
y -= 6 * mm
col_w1 = [42*mm, 34*mm, 38*mm, 60*mm]
sys_ejection = [
["Condition", "Mnemonic", "Location", "Key Trick"],
["Aortic Stenosis (AS)", "ARPO - A", "R 2nd ICS → Carotids", "Radiates to neck • Gallavardin effect at apex"],
["Pulmonary Stenosis (PS)", "ARPO - P", "L 2nd ICS → L shoulder", "Delayed P2 • Louder on inspiration"],
["HOCM", "ARPO - O", "L lower sternal border", "No carotid radiation • ↑ Valsalva/Standing"],
["ASD", "ARPO - A", "L 2nd-3rd ICS", "High flow across pulmonary • Fixed split S2"],
]
y = draw_table(sys_ejection, col_w1, y)
c.setFillColor(HexColor("#C1121F"))
c.setFont("Helvetica-Bold", 8.5)
c.drawString(MARGIN + 2 * mm, y - 1 * mm, "GROUP 2 — Pansystolic / Holosystolic [ plateau ] Mnemonic: \"MR. VSD\"")
y -= 6 * mm
col_w2 = [42*mm, 34*mm, 38*mm, 60*mm]
sys_pan = [
["Condition", "Mnemonic", "Location", "Key Trick"],
["Mitral Regurgitation (MR)", "MR. VSD - M", "Apex → Axilla", "Radiates to arMpit • ↑ handgrip/squatting"],
["Tricuspid Regurgitation (TR)", "MR. VSD - R", "L lower sternal → RSB", "Carvallo's sign: ↑ inspiration • JVP raised"],
["VSD", "MR. VSD - V", "L sternal 3rd-4th ICS", "Grade 4-5 • Small hole = BIG noise"],
]
y = draw_table(sys_pan, col_w2, y)
c.setFillColor(HexColor("#C1121F"))
c.setFont("Helvetica-Bold", 8.5)
c.drawString(MARGIN + 2 * mm, y - 1 * mm, "GROUP 3 — Late Systolic")
y -= 6 * mm
y = bullet("MVP (Mitral Valve Prolapse): Midsystolic CLICK → late crescendo murmur to S2 • \"Click then Rev\"", y, color=C_WHITE)
y = bullet("Standing / Valsalva → click moves EARLIER • Squatting → click moves LATER", y, color=HexColor("#C8DCE8"))
y -= 3 * mm
# ─────────────────────────────────────────────────────────────
# SECTION 2 – DIASTOLIC MURMURS
# ─────────────────────────────────────────────────────────────
y = section_header("DIASTOLIC MURMURS — Always Pathological → Always Echo", C_ACCENT2, y, icon="◀")
y -= 1 * mm
# Gold rule banner
c.setFillColor(HexColor("#1A2D42"))
c.setStrokeColor(C_ACCENT4)
c.setLineWidth(1)
c.roundRect(MARGIN, y - 8*mm, W - 2*MARGIN, 8*mm, 3, fill=1, stroke=1)
c.setFillColor(C_ACCENT4)
c.setFont("Helvetica-Bold", 9)
c.drawCentredString(W/2, y - 5.5*mm,
"⚠ Any diastolic murmur = ALWAYS abnormal • Warrants echocardiography • Never benign")
y -= 10 * mm
y = mnemonic_box("APPY",
"Aortic regurgitation (early) • Pulmonary regurgitation (early) • Presystolic MS • \"Y\"ell Rumble = MS mid-diastolic",
y, C_ACCENT2)
y -= 1.5 * mm
c.setFillColor(HexColor("#1A6B8A"))
c.setFont("Helvetica-Bold", 8.5)
c.drawString(MARGIN + 2*mm, y - 1*mm, "GROUP 1 — Early Diastolic Decrescendo Mnemonic: \"DAB\" (Decrescendo At Base)")
y -= 6*mm
col_w3 = [48*mm, 28*mm, 42*mm, 56*mm]
dias_early = [
["Condition", "Mnemonic", "Location", "Key Trick"],
["Aortic Regurgitation (AR)", "DAB - A", "L sternal border 3rd ICS", "Lean forward + breath held • Blowing high-pitch"],
["Pulmonary Regurgitation (PR)", "DAB - D", "L 2nd ICS", "Graham Steell = pulmonary HTN/Eisenmenger"],
]
y = draw_table(dias_early, col_w3, y)
c.setFillColor(HexColor("#1A6B8A"))
c.setFont("Helvetica-Bold", 8.5)
c.drawString(MARGIN + 2*mm, y - 1*mm, "GROUP 2 — Mid-to-Late Diastolic Rumble Mnemonic: \"MATT Rumbles\"")
y -= 6*mm
col_w4 = [48*mm, 28*mm, 42*mm, 56*mm]
dias_mid = [
["Condition", "Mnemonic", "Location", "Key Trick"],
["Mitral Stenosis (MS)", "MATT - M", "Apex (bell)", "Opening snap → Low rumble • Presystolic accentuation"],
["Tricuspid Stenosis (TS)", "MATT - T", "L lower sternal border", "Like MS but RIGHT-sided • ↑ inspiration"],
["Austin Flint murmur", "MATT - A", "Apex", "Functional MS from AR jet hitting mitral leaflet"],
["Carey Coombs murmur", "MATT - C", "Apex", "Rheumatic fever • Mid-diastolic • Acute"],
]
y = draw_table(dias_mid, col_w4, y)
y -= 2*mm
# ─────────────────────────────────────────────────────────────
# SECTION 3 – CONTINUOUS + BEDSIDE MANEUVERS (two columns)
# ─────────────────────────────────────────────────────────────
left_x = MARGIN
right_x = W / 2 + 3*mm
col_half = W / 2 - MARGIN - 3*mm
save_y = y
# LEFT: Continuous murmur
c.setFillColor(C_ACCENT3)
c.roundRect(left_x, y - 7*mm, col_half, 8.5*mm, 3, fill=1, stroke=0)
c.setFillColor(C_WHITE)
c.setFont("Helvetica-Bold", 10)
c.drawString(left_x + 3*mm, y - 4.5*mm, "⟳ CONTINUOUS MURMUR")
y -= 9*mm
y = mnemonic_box("PDA MARCHes",
"PDA • Mammary souffle • AV fistula • Ruptured Sinus of Valsalva • Coronary AV fistula • Hum (venous)",
y, C_ACCENT3)
y = bullet("PDA = 'Machinery murmur' • L infraclavicular • Peaks at S2", y, color=C_WHITE)
y = bullet("Venous hum = benign in children • disappears on lying down", y, color=HexColor("#C8DCE8"))
# RIGHT COLUMN: Bedside Maneuvers
y2 = save_y
c.setFillColor(C_ACCENT4)
c.roundRect(right_x, y2 - 7*mm, col_half, 8.5*mm, 3, fill=1, stroke=0)
c.setFillColor(C_BG)
c.setFont("Helvetica-Bold", 10)
c.drawString(right_x + 3*mm, y2 - 4.5*mm, "✋ BEDSIDE MANEUVERS — \"SURE\"")
y2 -= 9*mm
maneuver_data = [
["Maneuver", "↑ preload?", "Effect"],
["Valsalva / Stand", "↓ Preload", "HOCM ↑ • MVP earlier • AS/MR ↓"],
["Squat / Lie down", "↑ Preload", "HOCM ↓ • MVP later • AS/MR ↑"],
["Inspiration", "↑ R-sided", "TR/TS/PS ↑ (Carvallo's sign)"],
["Handgrip", "↑ Afterload", "MR/VSD/AR ↑ • HOCM/AS ↓"],
]
col_wm = [36*mm, 26*mm, col_half - 62*mm]
row_h = 7.2*mm
tbl_w2 = sum(col_wm)
xi0 = right_x
for ri, row in enumerate(maneuver_data):
is_hdr = (ri == 0)
bg = C_HEADER if is_hdr else [C_DARK_ROW, C_MID_ROW][ri % 2]
c.setFillColor(bg)
c.rect(xi0, y2 - row_h, tbl_w2, row_h, fill=1, stroke=0)
c.setStrokeColor(HexColor("#253D57"))
c.setLineWidth(0.4)
c.line(xi0, y2 - row_h, xi0 + tbl_w2, y2 - row_h)
xi = xi0
for ci, cell in enumerate(row):
cw = col_wm[ci]
if is_hdr:
c.setFillColor(C_LIGHT); c.setFont("Helvetica-Bold", 8)
elif ci == 0:
c.setFillColor(C_ACCENT4); c.setFont("Helvetica-Bold", 8)
elif ci == 1:
c.setFillColor(HexColor("#A8DADC")); c.setFont("Helvetica", 7.5)
else:
c.setFillColor(C_WHITE); c.setFont("Helvetica", 7.5)
c.drawString(xi + 2.5*mm, y2 - 5.5*mm, str(cell))
xi += cw
y2 -= row_h
# ─────────────────────────────────────────────────────────────
# FOOTER
# ─────────────────────────────────────────────────────────────
footer_y = 9*mm
c.setFillColor(C_HEADER)
c.rect(0, 0, W, footer_y + 2*mm, fill=1, stroke=0)
c.setFillColor(HexColor("#6B8EAD"))
c.setFont("Helvetica", 7)
c.drawString(MARGIN, footer_y - 2*mm,
"Sources: Harrison's Principles of Internal Medicine 22E (2025) • Braunwald's Heart Disease • Symptom to Diagnosis 4E")
c.setFont("Helvetica-Bold", 7)
c.setFillColor(C_LIGHT)
c.drawRightString(W - MARGIN, footer_y - 2*mm, "Orris Medical • Quick Reference Card")
c.setFillColor(C_ACCENT1)
c.rect(0, footer_y + 2*mm, W, 1.5, fill=1, stroke=0)
c.save()
print(f"PDF saved: {OUTPUT}")
make_card()
cd /home/daytona/workspace/murmur-card && python3 make_card.py
ls -lh /home/daytona/workspace/murmur-card/Murmur_Quick_Reference.pdf
Murmur Quick Reference
PDF Document · PDF